terrier-engine 4.31.0 → 4.32.1

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.
@@ -20,7 +20,7 @@ import Arrays from "tuff-core/arrays"
20
20
  import {FormFields} from "tuff-core/forms"
21
21
  import Fragments from "../../terrier/fragments"
22
22
  import {DiveDeliveryForm} from "./dive-delivery"
23
- import {DivePlotsForm} from "../plots/dive-plots"
23
+ import DivePlotList from "../plots/dive-plot-list"
24
24
 
25
25
  const log = new Logger("DiveEditor")
26
26
 
@@ -42,7 +42,7 @@ export default class DiveEditor extends ContentPart<DiveEditorState> {
42
42
 
43
43
  deliveryForm!: DiveDeliveryForm
44
44
 
45
- plotsForm!: DivePlotsForm
45
+ plotList!: DivePlotList
46
46
 
47
47
  newQueryKey = Messages.untypedKey()
48
48
  duplicateQueryKey = Messages.untypedKey()
@@ -121,7 +121,7 @@ export default class DiveEditor extends ContentPart<DiveEditorState> {
121
121
 
122
122
  this.deliveryForm = this.settingsTabs.upsertTab({key: 'delivery', title: "Delivery", icon: "glyp-email"}, DiveDeliveryForm, this.state)
123
123
 
124
- this.plotsForm = this.settingsTabs.upsertTab({key: 'plots', title: "Plots", icon: "glyp-differential"}, DivePlotsForm, this.state)
124
+ this.plotList = this.settingsTabs.upsertTab({key: 'plots', title: "Plots", icon: "glyp-differential"}, DivePlotList, this.state)
125
125
  }
126
126
 
127
127
  /**
@@ -1,4 +1,4 @@
1
- // This file was automatically generated on 2024-07-17 13:26:00 -0500, DO NOT EDIT IT MANUALLY!
1
+ // This file was automatically generated on 2024-07-25 17:02:53 -0500, DO NOT EDIT IT MANUALLY!
2
2
 
3
3
  import { Query } from "../queries/queries"
4
4
 
@@ -171,6 +171,7 @@ export type DdDiveRun = {
171
171
  output_data?: object
172
172
  output_file_data?: Attachment | { path: string }
173
173
  status: "initial" | "running" | "success" | "error"
174
+ delivery_mode?: string
174
175
  delivery_recipients?: string[]
175
176
  delivery_data?: object
176
177
  created_by?: DdUser
@@ -194,6 +195,7 @@ export type UnpersistedDdDiveRun = {
194
195
  output_data?: object
195
196
  output_file_data?: Attachment | { path: string }
196
197
  status: "initial" | "running" | "success" | "error"
198
+ delivery_mode?: string
197
199
  delivery_recipients?: string[]
198
200
  delivery_data?: object
199
201
  created_by?: DdUser
@@ -0,0 +1,62 @@
1
+ import {AxisType} from "tuff-plot/axis"
2
+ import {TerrierFormFields} from "../../terrier/forms"
3
+ import {PartTag} from "tuff-core/parts"
4
+ import TerrierPart from "../../terrier/parts/terrier-part"
5
+ import {DbErrors} from "../../terrier/db-client"
6
+ import * as inflection from "inflection"
7
+
8
+
9
+ // let's not worry about a top axis for now
10
+ const axisSides = ['left', 'bottom', 'right'] as const
11
+ export type AxisSide = typeof axisSides[number]
12
+
13
+ export type DivePlotAxisType = AxisType | 'none'
14
+
15
+ export type DivePlotAxis = {
16
+ type: DivePlotAxisType
17
+ title: string
18
+ }
19
+
20
+ const axisTypeOptions = [
21
+ {value: 'none', title: 'None'},
22
+ {value: 'number', title: 'Number'},
23
+ {value: 'time', title: 'Date/Time'},
24
+ {value: 'group', title: 'Grouped Bars'},
25
+ {value: 'stack', title: 'Stacked Bars'},
26
+ ]
27
+
28
+ export class DivePlotAxisFields extends TerrierFormFields<DivePlotAxis> {
29
+
30
+ constructor(part: TerrierPart<any>, axis: DivePlotAxis, readonly side: AxisSide, errors?: DbErrors<DivePlotAxis>) {
31
+ super(part, axis, errors)
32
+ }
33
+
34
+ render(parent: PartTag) {
35
+ parent.div(`.dd-dive-plot-axis-fields.tt-form.shrink.${this.side}`, container => {
36
+ container.div('.side').text(`${inflection.titleize(this.side)} Axis:`)
37
+
38
+ // title
39
+ this.textInput(container, "title", {placeholder: "Title"})
40
+
41
+ // type
42
+ const typeDir = this.side == 'bottom' ? 'row' : 'column'
43
+ container.div(`.tt-flex.wrapped.small-gap.${typeDir}`, flex => {
44
+ axisTypeOptions.forEach(option => {
45
+ if ((this.side == 'bottom' || this.side == 'left') && option.value == 'none') {
46
+ return // don't let them not have a bottom or left axis
47
+ }
48
+ flex.label(".caption-size", label => {
49
+ this.radio(label, 'type', option.value)
50
+ label.span().text(option.title)
51
+ })
52
+ })
53
+ })
54
+ })
55
+ }
56
+ }
57
+
58
+
59
+ const DivePlotAxes = {
60
+ axisSides
61
+ }
62
+ export default DivePlotAxes
@@ -0,0 +1,118 @@
1
+ import { PartTag } from "tuff-core/parts"
2
+ import {ModalPart} from "../../terrier/modals"
3
+ import {DiveEditorState} from "../dives/dive-editor"
4
+ import {UnpersistedDdDivePlot} from "../gen/models"
5
+ import {TerrierFormFields} from "../../terrier/forms"
6
+ import Messages from "tuff-core/messages"
7
+ import {Logger} from "tuff-core/logging"
8
+ import DivePlotList from "./dive-plot-list"
9
+ import Db from "../dd-db"
10
+ import DivePlotRenderPart from "./dive-plot-render-part"
11
+ import {DivePlotAxis, DivePlotAxisFields} from "./dive-plot-axes"
12
+ import {DivePlotTrace} from "./dive-plot-trace"
13
+
14
+ const log = new Logger("DivePlotList")
15
+
16
+ export type DivePlotEditorState = DiveEditorState & {
17
+ plot: UnpersistedDdDivePlot
18
+ }
19
+
20
+ export default class DivePlotEditor extends ModalPart<DivePlotEditorState> {
21
+
22
+ plot!: UnpersistedDdDivePlot
23
+ fields!: TerrierFormFields<UnpersistedDdDivePlot>
24
+ leftAxisFields!: DivePlotAxisFields
25
+ rightAxisFields!: DivePlotAxisFields
26
+ bottomAxisFields!: DivePlotAxisFields
27
+ traces: DivePlotTrace[] = []
28
+ renderPart!: DivePlotRenderPart
29
+ saveKey = Messages.untypedKey()
30
+
31
+ async init() {
32
+ this.plot = this.state.plot
33
+
34
+ if (this.plot.id?.length) {
35
+ this.setTitle("Edit Dive Plot")
36
+ }
37
+ else {
38
+ this.setTitle("New Dive Plot")
39
+ }
40
+ this.setIcon("hub-plot")
41
+
42
+ this.fields = new TerrierFormFields<UnpersistedDdDivePlot>(this, this.plot)
43
+
44
+ // axis fields
45
+ const axes = this.plot.layout.axes || {}
46
+ const leftAxis: DivePlotAxis = axes['left'] || {type: 'number', title: ''}
47
+ this.leftAxisFields = new DivePlotAxisFields(this, leftAxis, 'left')
48
+ const rightAxis: DivePlotAxis = axes['right'] || {type: 'none', title: ''}
49
+ this.rightAxisFields = new DivePlotAxisFields(this, rightAxis, 'right')
50
+ const bottomAxis: DivePlotAxis = axes['bottom'] || {type: 'number', title: ''}
51
+ this.bottomAxisFields = new DivePlotAxisFields(this, bottomAxis, 'bottom')
52
+
53
+ this.traces = this.plot.traces || []
54
+
55
+ this.renderPart = this.makePart(DivePlotRenderPart, this.state)
56
+
57
+ this.addAction({
58
+ title: "Save",
59
+ icon: "hub-checkmark",
60
+ click: {key: this.saveKey}
61
+ })
62
+
63
+ this.onClick(this.saveKey, _ => {
64
+ log.debug("Saving plot", this.plot)
65
+ this.save()
66
+ })
67
+ }
68
+
69
+ renderContent(parent: PartTag): void {
70
+ parent.div(".tt-flex.column.padded.gap", mainColumn => {
71
+
72
+ mainColumn.div(".dd-plot-axes-and-preview.tt-flex.column.gap", axesAndPreview => {
73
+ this.fields.compoundField(axesAndPreview, field => {
74
+ field.label(".required").text("Title")
75
+ this.fields.textInput(field, 'title', {class: 'shrink plot-title'})
76
+ }).class('plot-title-field')
77
+ axesAndPreview.div('.tt-flex.gap', row => {
78
+ this.leftAxisFields.render(row)
79
+ row.part(this.renderPart)
80
+ this.rightAxisFields.render(row)
81
+ })
82
+ this.bottomAxisFields.render(axesAndPreview)
83
+ })
84
+
85
+
86
+ mainColumn.h3(".glyp-items").text("Traces")
87
+
88
+ })
89
+ }
90
+
91
+ async save() {
92
+ const plotData = await this.fields.serialize()
93
+ const plot = {...this.plot, title: plotData.title}
94
+
95
+ plot.layout.axes = {
96
+ left: await this.leftAxisFields.serialize(),
97
+ bottom: await this.bottomAxisFields.serialize(),
98
+ right: await this.rightAxisFields.serialize()
99
+ }
100
+
101
+ log.info("Saving plot", plot)
102
+
103
+ const res = await Db().upsert('dd_dive_plot', plot)
104
+ if (res.status == 'success') {
105
+ this.state.plot = res.record
106
+ this.emitMessage(DivePlotList.reloadKey, {})
107
+ this.successToast("Successfully Saved Plot")
108
+ return this.pop()
109
+ }
110
+
111
+ // errors
112
+ log.warn("Error saving plot", res)
113
+ this.alertToast(res.message)
114
+
115
+ }
116
+ }
117
+
118
+
@@ -0,0 +1,107 @@
1
+ import TerrierPart from "../../terrier/parts/terrier-part"
2
+ import {DiveEditorState} from "../dives/dive-editor"
3
+ import {PartTag} from "tuff-core/parts"
4
+ import {DdDivePlot, UnpersistedDdDivePlot} from "../gen/models"
5
+ import DivePlots from "./dive-plots"
6
+ import Fragments from "../../terrier/fragments"
7
+ import Messages from "tuff-core/messages"
8
+ import {Logger} from "tuff-core/logging"
9
+ import DivePlotEditor from "./dive-plot-editor"
10
+ import DivePlotRenderPart, {DivePlotRenderState} from "./dive-plot-render-part"
11
+
12
+ const log = new Logger("DivePlotList")
13
+
14
+ const editKey = Messages.typedKey<{ id: string }>()
15
+
16
+ class DivePlotPreview extends TerrierPart<DivePlotRenderState> {
17
+
18
+ renderPart!: DivePlotRenderPart
19
+
20
+ async init() {
21
+ this.renderPart = this.makePart(DivePlotRenderPart, this.state)
22
+ }
23
+
24
+ get parentClasses(): Array<string> {
25
+ return ['dd-dive-plot-preview']
26
+ }
27
+
28
+ render(parent: PartTag) {
29
+ parent.h3(".plot-title", title => {
30
+ title.i('.shrink.icon-only.glyp-differential')
31
+ title.div('.text-center.stretch').text(this.state.plot.title)
32
+ title.a('.glyp-settings.icon-only')
33
+ .data({tooltip: "Edit this plot"})
34
+ .emitClick(editKey, {id: this.state.plot.id})
35
+ })
36
+ parent.part(this.renderPart)
37
+ }
38
+ }
39
+
40
+ /**
41
+ * A list of plots.
42
+ */
43
+ export default class DivePlotList extends TerrierPart<DiveEditorState> {
44
+
45
+ newKey = Messages.untypedKey()
46
+ static reloadKey = Messages.untypedKey()
47
+
48
+ plots!: DdDivePlot[]
49
+
50
+ get parentClasses(): Array<string> {
51
+ return ['dd-dive-plot-list', 'tt-flex', 'column', 'gap', 'dd-dive-tool', 'tt-typography']
52
+ }
53
+
54
+ async init() {
55
+ await this.reload()
56
+
57
+ this.onClick(this.newKey, _ => {
58
+ log.debug("New Plot")
59
+ const plot: UnpersistedDdDivePlot = {
60
+ title: this.state.dive.name,
61
+ dd_dive_id: this.state.dive.id,
62
+ layout: {},
63
+ traces: []
64
+ }
65
+ this.app.showModal(DivePlotEditor, {...this.state, plot})
66
+ })
67
+
68
+ this.onClick(editKey, m => {
69
+ const id = m.data.id
70
+ log.info(`Editing plot ${id}`)
71
+ const plot: UnpersistedDdDivePlot | undefined = this.plots.filter(p => p.id === id)[0]
72
+ if (plot) {
73
+ this.app.showModal(DivePlotEditor, {...this.state, plot})
74
+ }
75
+ else {
76
+ log.warn(`Couldn't find a plot with id=${id}`)
77
+ }
78
+ })
79
+
80
+ this.listenMessage(DivePlotList.reloadKey, _ => {
81
+ log.info("Reloading...")
82
+ this.reload().then(() => {
83
+ log.info("Reloaded from an external message")
84
+ })
85
+ }, {attach: 'passive'})
86
+
87
+ this.dirty()
88
+ }
89
+
90
+ async reload() {
91
+ log.info("Reloading")
92
+ this.plots = await DivePlots.get(this.state.dive)
93
+
94
+ const plotStates = this.plots.map((plot) => {return {...this.state, plot}})
95
+ this.assignCollection("plots", DivePlotPreview, plotStates)
96
+
97
+ this.dirty()
98
+ }
99
+
100
+ render(parent: PartTag): any {
101
+ this.renderCollection(parent, "plots")
102
+
103
+ Fragments.button(parent, this.theme, "New Plot", "hub-plus", "secondary")
104
+ .emitClick(this.newKey)
105
+ }
106
+
107
+ }
@@ -0,0 +1,23 @@
1
+ import TerrierPart from "../../terrier/parts/terrier-part"
2
+ import {PartTag} from "tuff-core/parts"
3
+ import {DivePlotEditorState} from "./dive-plot-editor"
4
+ import {UnpersistedDdDivePlot} from "../gen/models"
5
+
6
+ export type DivePlotRenderState = DivePlotEditorState & {
7
+ plot: UnpersistedDdDivePlot
8
+ }
9
+
10
+ /**
11
+ * Actually renders a dive plot.
12
+ */
13
+ export default class DivePlotRenderPart extends TerrierPart<DivePlotRenderState> {
14
+
15
+
16
+ get parentClasses(): Array<string> {
17
+ return ['dd-dive-plot-render']
18
+ }
19
+
20
+ render(parent: PartTag) {
21
+ parent.div().text(`${this.state.plot.title} Render`)
22
+ }
23
+ }
@@ -0,0 +1,16 @@
1
+ import {MarkerStyle, TraceStyle, TraceType, YAxisName} from "tuff-plot/trace";
2
+
3
+ /**
4
+ * Similar to the tuff-plot Trace but not strongly typed to the data type since it's dynamically assigned to a query.
5
+ */
6
+ export type DivePlotTrace = {
7
+ id: string
8
+ type: TraceType
9
+ title: string
10
+ query_id: string
11
+ x: string
12
+ y: string
13
+ y_axis: YAxisName
14
+ style?: TraceStyle
15
+ marker?: MarkerStyle
16
+ }
@@ -1,29 +1,32 @@
1
- import TerrierFormPart from "../../terrier/parts/terrier-form-part"
2
- import {DiveEditorState} from "../dives/dive-editor"
3
- import {PartTag} from "tuff-core/parts"
4
- import {MarkerStyle, TraceStyle, TraceType, YAxisName} from "tuff-plot/trace"
5
- import {PlotLayout} from "tuff-plot/layout"
1
+ import {DdDive, DdDivePlot} from "../gen/models"
2
+ import Db from "../dd-db"
3
+ import {DivePlotAxis} from "./dive-plot-axes"
6
4
 
7
5
 
8
- export type DivePlotTrace = {
9
- id: string
10
- type: TraceType
11
- title: string
12
- query_id: string
13
- x: string
14
- y: string
15
- y_axis: YAxisName
16
- style?: TraceStyle
17
- marker?: MarkerStyle
18
- }
19
-
20
- // maybe we'll add more in the future
21
- export type DivePlotLayout = PlotLayout
6
+ // mimic PlotLayout but with our own types
7
+ export type DivePlotLayout = {
8
+ pad?: number
9
+ axes?: {
10
+ left?: DivePlotAxis
11
+ top?: DivePlotAxis
12
+ right?: DivePlotAxis
13
+ bottom?: DivePlotAxis
14
+ }
22
15
 
16
+ }
17
+ /**
18
+ * Get all plots for the given dive.
19
+ * @param dive
20
+ */
21
+ async function get(dive: DdDive): Promise<DdDivePlot[]> {
22
+ return await Db().query('dd_dive_plot')
23
+ .where({dd_dive_id: dive.id, _state: 0})
24
+ .orderBy("title ASC")
25
+ .exec()
26
+ }
23
27
 
24
- export class DivePlotsForm extends TerrierFormPart<DiveEditorState> {
25
- render(parent: PartTag): any {
26
- parent.h3(".coming-soon.glyp-developer").text("Coming Soon")
27
- }
28
28
 
29
- }
29
+ const DivePlots = {
30
+ get
31
+ }
32
+ export default DivePlots
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "files": [
5
5
  "*"
6
6
  ],
7
- "version": "4.31.0",
7
+ "version": "4.32.1",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/Terrier-Tech/terrier-engine"
package/terrier/forms.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import {Field, FormFields, FormPartData, InputType, KeyOfType, SelectOptions} from "tuff-core/forms"
2
2
  import {DbErrors} from "./db-client"
3
3
  import {PartTag} from "tuff-core/parts"
4
- import {InputTag, InputTagAttrs, SelectTag, SelectTagAttrs, TextAreaTag, TextAreaTagAttrs} from "tuff-core/html"
4
+ import {DivTag, InputTag, InputTagAttrs, SelectTag, SelectTagAttrs, TextAreaTag, TextAreaTagAttrs} from "tuff-core/html"
5
5
  import TerrierPart from "./parts/terrier-part"
6
6
  import GlypPicker from "./parts/glyp-picker"
7
7
  import Glyps from "./glyps"
@@ -55,7 +55,7 @@ function titleizeOptions(opts: readonly string[], blank?: string): SelectOptions
55
55
  ////////////////////////////////////////////////////////////////////////////////
56
56
 
57
57
  /**
58
- * Override regular `FormFields` methods to include validation errors.
58
+ * Override regular `FormFields` methods to include validation errors and optional compound fields.
59
59
  */
60
60
  export class TerrierFormFields<T extends FormPartData> extends FormFields<T> {
61
61
 
@@ -141,6 +141,20 @@ export class TerrierFormFields<T extends FormPartData> extends FormFields<T> {
141
141
  }
142
142
  }).emitClick(this.pickGlypKey, {key})
143
143
  }
144
+
145
+
146
+ /**
147
+ * Creates a .tt-compound-field tag and passes the field to the nested function.
148
+ * I suppose it's just a slight convenience over having `parent.div(".tt-compound-field"...` everywhere.
149
+ * @param parent
150
+ * @param fun a function that accepts the field as an argument, to actually populate the field
151
+ */
152
+ compoundField(parent: PartTag, fun: (field: DivTag) => any) {
153
+ return parent.div(".tt-compound-field", field => {
154
+ fun(field)
155
+ })
156
+ }
157
+
144
158
  }
145
159
 
146
160
 
@@ -1,4 +1,4 @@
1
- // This file was automatically generated on 2024-07-11 09:04:26 -0500, DO NOT EDIT IT MANUALLY!
1
+ // This file was automatically generated on 2024-07-18 14:22:23 -0500, DO NOT EDIT IT MANUALLY!
2
2
 
3
3
  import {ColorName} from "../theme"
4
4
  import {PartTag} from "tuff-core/parts"
@@ -209,6 +209,10 @@ import LevelParkingRaw from '../images/icons/level_parking.svg?raw'
209
209
  // @ts-ignore
210
210
  import LevelParkingSrc from '../images/icons/level_parking.svg'
211
211
  // @ts-ignore
212
+ import LinkRaw from '../images/icons/link.svg?raw'
213
+ // @ts-ignore
214
+ import LinkSrc from '../images/icons/link.svg'
215
+ // @ts-ignore
212
216
  import ListViewRaw from '../images/icons/list_view.svg?raw'
213
217
  // @ts-ignore
214
218
  import ListViewSrc from '../images/icons/list_view.svg'
@@ -241,6 +245,10 @@ import PendingRaw from '../images/icons/pending.svg?raw'
241
245
  // @ts-ignore
242
246
  import PendingSrc from '../images/icons/pending.svg'
243
247
  // @ts-ignore
248
+ import PlotRaw from '../images/icons/plot.svg?raw'
249
+ // @ts-ignore
250
+ import PlotSrc from '../images/icons/plot.svg'
251
+ // @ts-ignore
244
252
  import PlusRaw from '../images/icons/plus.svg?raw'
245
253
  // @ts-ignore
246
254
  import PlusSrc from '../images/icons/plus.svg'
@@ -594,6 +602,10 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
594
602
  raw: LevelParkingRaw,
595
603
  src: LevelParkingSrc,
596
604
  },
605
+ "hub-link": {
606
+ raw: LinkRaw,
607
+ src: LinkSrc,
608
+ },
597
609
  "hub-list_view": {
598
610
  raw: ListViewRaw,
599
611
  src: ListViewSrc,
@@ -626,6 +638,10 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
626
638
  raw: PendingRaw,
627
639
  src: PendingSrc,
628
640
  },
641
+ "hub-plot": {
642
+ raw: PlotRaw,
643
+ src: PlotSrc,
644
+ },
629
645
  "hub-plus": {
630
646
  raw: PlusRaw,
631
647
  src: PlusSrc,
@@ -777,7 +793,7 @@ export const IconDefs: Record<HubIconName,{ raw: string, src: string }> = {
777
793
  }
778
794
 
779
795
  const Names = [
780
- 'hub-active', 'hub-admin', 'hub-archive', 'hub-arrow_down', 'hub-arrow_left', 'hub-arrow_right', 'hub-arrow_up', 'hub-assign', 'hub-attachment', 'hub-back', 'hub-badge', 'hub-board', 'hub-branch', 'hub-bug', 'hub-calculator', 'hub-checkmark', 'hub-close', 'hub-clypboard', 'hub-comment', 'hub-complete', 'hub-dashboard', 'hub-data_pull', 'hub-data_update', 'hub-database', 'hub-day', 'hub-delete', 'hub-documentation', 'hub-edit', 'hub-existing_child', 'hub-existing_parent', 'hub-feature', 'hub-flex', 'hub-forward', 'hub-github', 'hub-history', 'hub-home', 'hub-image', 'hub-inbox', 'hub-info', 'hub-internal', 'hub-issue', 'hub-lane', 'hub-lane_asap', 'hub-lane_days', 'hub-lane_hours', 'hub-lane_weeks', 'hub-lanes_board', 'hub-level_complete', 'hub-level_highway', 'hub-level_on_ramp', 'hub-level_parking', 'hub-list_view', 'hub-metrics', 'hub-minus', 'hub-new_child', 'hub-new_parent', 'hub-night', 'hub-origin', 'hub-pending', 'hub-plus', 'hub-post', 'hub-posts', 'hub-pr_closed', 'hub-pr_merged', 'hub-pr_open', 'hub-prioritized', 'hub-project', 'hub-question', 'hub-reaction', 'hub-read_mail', 'hub-recent', 'hub-refresh', 'hub-related_posts', 'hub-releases', 'hub-request', 'hub-settings', 'hub-split_view', 'hub-status', 'hub-step_deploy', 'hub-step_develop', 'hub-step_investigate', 'hub-step_review', 'hub-step_test', 'hub-steps', 'hub-steps_board', 'hub-subscribe', 'hub-support', 'hub-terrier', 'hub-thumbs_up', 'hub-type', 'hub-unprioritized', 'hub-upload', 'hub-user', 'hub-users', 'hub-website', 'hub-week'
796
+ 'hub-active', 'hub-admin', 'hub-archive', 'hub-arrow_down', 'hub-arrow_left', 'hub-arrow_right', 'hub-arrow_up', 'hub-assign', 'hub-attachment', 'hub-back', 'hub-badge', 'hub-board', 'hub-branch', 'hub-bug', 'hub-calculator', 'hub-checkmark', 'hub-close', 'hub-clypboard', 'hub-comment', 'hub-complete', 'hub-dashboard', 'hub-data_pull', 'hub-data_update', 'hub-database', 'hub-day', 'hub-delete', 'hub-documentation', 'hub-edit', 'hub-existing_child', 'hub-existing_parent', 'hub-feature', 'hub-flex', 'hub-forward', 'hub-github', 'hub-history', 'hub-home', 'hub-image', 'hub-inbox', 'hub-info', 'hub-internal', 'hub-issue', 'hub-lane', 'hub-lane_asap', 'hub-lane_days', 'hub-lane_hours', 'hub-lane_weeks', 'hub-lanes_board', 'hub-level_complete', 'hub-level_highway', 'hub-level_on_ramp', 'hub-level_parking', 'hub-link', 'hub-list_view', 'hub-metrics', 'hub-minus', 'hub-new_child', 'hub-new_parent', 'hub-night', 'hub-origin', 'hub-pending', 'hub-plot', 'hub-plus', 'hub-post', 'hub-posts', 'hub-pr_closed', 'hub-pr_merged', 'hub-pr_open', 'hub-prioritized', 'hub-project', 'hub-question', 'hub-reaction', 'hub-read_mail', 'hub-recent', 'hub-refresh', 'hub-related_posts', 'hub-releases', 'hub-request', 'hub-settings', 'hub-split_view', 'hub-status', 'hub-step_deploy', 'hub-step_develop', 'hub-step_investigate', 'hub-step_review', 'hub-step_test', 'hub-steps', 'hub-steps_board', 'hub-subscribe', 'hub-support', 'hub-terrier', 'hub-thumbs_up', 'hub-type', 'hub-unprioritized', 'hub-upload', 'hub-user', 'hub-users', 'hub-website', 'hub-week'
781
797
  ] as const
782
798
 
783
799
  export type HubIconName = typeof Names[number]
package/terrier/glyps.ts CHANGED
@@ -1,8 +1,8 @@
1
- // This file was automatically generated by glyps:compile on 07/10/24 8:00 AM, DO NOT MANUALLY EDIT!
1
+ // This file was automatically generated by glyps:compile on 07/23/24 2:23 PM, DO NOT MANUALLY EDIT!
2
2
 
3
3
  import Strings from "tuff-core/strings"
4
4
 
5
- const names = ['glyp-abacus', 'glyp-account', 'glyp-accounts_payable', 'glyp-accounts_receivable', 'glyp-action_log', 'glyp-activate', 'glyp-active', 'glyp-activity_high', 'glyp-activity_low', 'glyp-activity_medium', 'glyp-activity_none', 'glyp-address1', 'glyp-adjustment', 'glyp-admin', 'glyp-administration', 'glyp-air_freshener', 'glyp-alert', 'glyp-align_horizontal', 'glyp-align_vertical', 'glyp-anchor', 'glyp-announcement', 'glyp-app_update', 'glyp-append_selection', 'glyp-appointment', 'glyp-appointment_setup', 'glyp-archive', 'glyp-arrow_down', 'glyp-arrow_left', 'glyp-arrow_right', 'glyp-arrow_transfer', 'glyp-arrow_up', 'glyp-ascending', 'glyp-attachment', 'glyp-audit_analyzer', 'glyp-autopay', 'glyp-availability', 'glyp-background_batch', 'glyp-background_job', 'glyp-bait_for_demolition', 'glyp-bar_chart', 'glyp-barcode', 'glyp-bat_exclusion', 'glyp-bed_bug_fumigation', 'glyp-begin_service', 'glyp-belongs_to', 'glyp-billing', 'glyp-billing_office', 'glyp-billing_terms', 'glyp-billto', 'glyp-bioremediation', 'glyp-bird_exclusion', 'glyp-black_light', 'glyp-branch', 'glyp-branch_bats', 'glyp-branch_birds', 'glyp-branch_general', 'glyp-branch_irrigation', 'glyp-branch_landscape', 'glyp-branch_multi_housing', 'glyp-branch_office', 'glyp-branch_orders', 'glyp-branch_residential', 'glyp-branch_sales', 'glyp-branch_termites', 'glyp-branch_weeds', 'glyp-branch_wildlife', 'glyp-build', 'glyp-calculate', 'glyp-calendar', 'glyp-calendar_branch', 'glyp-calendar_map', 'glyp-calendar_rolling', 'glyp-calendar_share', 'glyp-calendar_snap', 'glyp-california', 'glyp-call', 'glyp-callback', 'glyp-camera', 'glyp-cancellation', 'glyp-cancelled', 'glyp-card_american_express', 'glyp-card_discover', 'glyp-card_mastercard', 'glyp-card_visa', 'glyp-catalog', 'glyp-caught', 'glyp-cert', 'glyp-check_all', 'glyp-check_in', 'glyp-check_in_service', 'glyp-checked', 'glyp-checked_empty', 'glyp-checkmark', 'glyp-checkmark_filled', 'glyp-checkout', 'glyp-chemical', 'glyp-chemical_authorization', 'glyp-chemical_backpack_sprayer', 'glyp-chemical_biological_controls', 'glyp-chemical_disinfectant', 'glyp-chemical_fertilizer', 'glyp-chemical_flying_insect_bait', 'glyp-chemical_fumigants', 'glyp-chemical_insect_aerosol', 'glyp-chemical_insect_bait', 'glyp-chemical_insect_dust', 'glyp-chemical_insect_granules', 'glyp-chemical_insect_spray', 'glyp-chemical_label', 'glyp-chemical_mole_bait', 'glyp-chemical_pest_bird_control', 'glyp-chemical_pheromone_products', 'glyp-chemical_power_sprayer', 'glyp-chemical_rodenticide_block', 'glyp-chemical_rodenticide_non_block', 'glyp-chemical_sds', 'glyp-chemical_tree_products', 'glyp-chemical_weed_control', 'glyp-chemical_wildlife_repellents', 'glyp-chemical_wildlife_toxicants', 'glyp-chevron_down', 'glyp-chevron_left', 'glyp-chevron_right', 'glyp-chevron_up', 'glyp-city', 'glyp-click', 'glyp-client_actions', 'glyp-client_pest_sightings', 'glyp-client_required', 'glyp-close', 'glyp-cloud', 'glyp-clypboard', 'glyp-clypedia', 'glyp-clypmart', 'glyp-code', 'glyp-code_details', 'glyp-collections', 'glyp-columns', 'glyp-comment', 'glyp-comment_filled', 'glyp-commission_origin', 'glyp-commissions', 'glyp-company_setup', 'glyp-compass', 'glyp-complete', 'glyp-complete_certificate', 'glyp-complete_enrollment', 'glyp-condition_appliance_machinery', 'glyp-condition_customer', 'glyp-condition_device', 'glyp-condition_door_window', 'glyp-condition_dumpster', 'glyp-condition_entry_point', 'glyp-condition_evidence', 'glyp-condition_exclusion', 'glyp-condition_exterior', 'glyp-condition_interior', 'glyp-condition_plumbing', 'glyp-condition_prep_storage', 'glyp-condition_rodent_evidence', 'glyp-condition_rodent_exclusion', 'glyp-condition_roof_ceiling', 'glyp-condition_structure', 'glyp-condition_supplies', 'glyp-condition_termites', 'glyp-condition_ventilation', 'glyp-condition_wall_floor', 'glyp-condition_wildlife', 'glyp-conditions', 'glyp-consolidate', 'glyp-construction', 'glyp-contract', 'glyp-contract_cancellation', 'glyp-contract_overview', 'glyp-conversation', 'glyp-copesan', 'glyp-copy', 'glyp-credit_memo', 'glyp-credit_non_revenue', 'glyp-credit_production', 'glyp-credit_prospect', 'glyp-credit_sales_bonus', 'glyp-crew', 'glyp-cumulative', 'glyp-cursor', 'glyp-custom_form', 'glyp-customer', 'glyp-customer_service', 'glyp-dashboard', 'glyp-data_dive', 'glyp-data_dive_query', 'glyp-data_dives', 'glyp-database', 'glyp-dead_animal_removal', 'glyp-default', 'glyp-delete', 'glyp-demo_mode', 'glyp-descending', 'glyp-design', 'glyp-desktop', 'glyp-detail_report', 'glyp-developer', 'glyp-device', 'glyp-device_sync', 'glyp-differential', 'glyp-disable', 'glyp-disabled_filled', 'glyp-distribute_horizontal', 'glyp-distribute_vertical', 'glyp-division', 'glyp-document', 'glyp-documentation', 'glyp-documents', 'glyp-download', 'glyp-driving', 'glyp-duplicate', 'glyp-duplicate_location', 'glyp-duration', 'glyp-edit', 'glyp-email', 'glyp-employment', 'glyp-entertainment_public_venues', 'glyp-equipment_bear_trap', 'glyp-equipment_flying_insect_bait_station', 'glyp-equipment_flying_insect_light_trap', 'glyp-equipment_insect_monitor', 'glyp-equipment_lethal_animal_trap', 'glyp-equipment_live_animal_trap', 'glyp-equipment_live_rodent_trap', 'glyp-equipment_maintenance', 'glyp-equipment_map_viewer', 'glyp-equipment_maps', 'glyp-equipment_mosquito_trap', 'glyp-equipment_other', 'glyp-equipment_pheromone_trap', 'glyp-equipment_pick_up', 'glyp-equipment_rodent_bait', 'glyp-equipment_rodent_trap', 'glyp-equipment_termite_bait_station', 'glyp-equipment_termite_monitor', 'glyp-exclusion', 'glyp-expand', 'glyp-expired', 'glyp-expiring', 'glyp-exterior', 'glyp-extras', 'glyp-facebook', 'glyp-farm', 'glyp-farm_grain_seed', 'glyp-fast_and_frequent', 'glyp-favorite', 'glyp-feedback', 'glyp-field_guide', 'glyp-field_training', 'glyp-file_blank', 'glyp-file_html', 'glyp-file_image', 'glyp-file_pdf', 'glyp-file_printable', 'glyp-file_spreadsheet', 'glyp-file_text', 'glyp-filter', 'glyp-finance', 'glyp-finding', 'glyp-fogging', 'glyp-folder', 'glyp-followup', 'glyp-food_bev_pharma', 'glyp-formula', 'glyp-fuel', 'glyp-fumigation', 'glyp-function', 'glyp-function_aggregate', 'glyp-function_time', 'glyp-gain_loss', 'glyp-generate_invoices', 'glyp-generate_orders', 'glyp-geo', 'glyp-geo_heat_map', 'glyp-google', 'glyp-google_calendar', 'glyp-government', 'glyp-grain_seed', 'glyp-grid', 'glyp-grouped', 'glyp-grouping_combine', 'glyp-grouping_separate', 'glyp-has_many', 'glyp-health_care', 'glyp-heat_map', 'glyp-heat_treatment', 'glyp-help', 'glyp-hidden', 'glyp-hint', 'glyp-honeybee_removal', 'glyp-housing', 'glyp-icon', 'glyp-identifier', 'glyp-import', 'glyp-import_data', 'glyp-in_progress', 'glyp-inbox', 'glyp-incomplete_certificate', 'glyp-industrial', 'glyp-info', 'glyp-information_technology', 'glyp-inspect_map', 'glyp-inspections', 'glyp-insulation', 'glyp-interior', 'glyp-invoice', 'glyp-invoice_review', 'glyp-irrigation_install', 'glyp-irrigation_maintenance', 'glyp-items', 'glyp-job', 'glyp-job_plan', 'glyp-job_plan_history', 'glyp-job_plan_run', 'glyp-join', 'glyp-join_inner', 'glyp-join_left', 'glyp-justice', 'glyp-k9_inspection', 'glyp-key', 'glyp-label_bottom', 'glyp-label_left', 'glyp-label_right', 'glyp-label_top', 'glyp-labor', 'glyp-landscape', 'glyp-landscape_maintenance', 'glyp-laptop', 'glyp-lead', 'glyp-lead_listing', 'glyp-lead_source', 'glyp-leads_report', 'glyp-learning_hub', 'glyp-ledger', 'glyp-legal', 'glyp-license', 'glyp-lifetime', 'glyp-line_cap_arrow', 'glyp-line_cap_bar', 'glyp-line_cap_circle', 'glyp-line_cap_none', 'glyp-line_caps', 'glyp-line_style', 'glyp-link', 'glyp-location', 'glyp-location_charge', 'glyp-location_credit', 'glyp-location_import', 'glyp-location_kind', 'glyp-location_message', 'glyp-location_origin', 'glyp-location_seed', 'glyp-location_tags', 'glyp-locations', 'glyp-locked', 'glyp-lodging', 'glyp-log_in', 'glyp-log_out', 'glyp-log_report', 'glyp-logbook', 'glyp-logbook_documents', 'glyp-lot_number', 'glyp-manager', 'glyp-map', 'glyp-markdown', 'glyp-market', 'glyp-materials', 'glyp-mattress_encasement', 'glyp-merge', 'glyp-message_billing', 'glyp-message_collections', 'glyp-message_complaint', 'glyp-message_misc', 'glyp-message_technician', 'glyp-messages', 'glyp-misc', 'glyp-miscellaneous', 'glyp-move_order', 'glyp-mowing', 'glyp-multi_housing', 'glyp-multi_tech_order', 'glyp-mute', 'glyp-navicon', 'glyp-new_location', 'glyp-new_ticket', 'glyp-no_charge', 'glyp-no_service', 'glyp-note', 'glyp-note_access', 'glyp-note_billing', 'glyp-note_collection', 'glyp-note_complaint', 'glyp-note_directions', 'glyp-note_focused', 'glyp-note_office', 'glyp-note_preservice', 'glyp-note_sales', 'glyp-note_service', 'glyp-notification', 'glyp-number', 'glyp-office', 'glyp-office_government', 'glyp-office_training', 'glyp-on_demand', 'glyp-on_demand_order', 'glyp-open', 'glyp-open_invoice', 'glyp-operations', 'glyp-options', 'glyp-order_actions', 'glyp-order_approved', 'glyp-order_batch', 'glyp-order_editor', 'glyp-order_pending', 'glyp-order_series', 'glyp-order_unapproved', 'glyp-org_structure', 'glyp-org_unit', 'glyp-org_unit_settings', 'glyp-origin', 'glyp-origin_client', 'glyp-origin_tech', 'glyp-outbox', 'glyp-outlook', 'glyp-overlap', 'glyp-password', 'glyp-past_due', 'glyp-paused', 'glyp-pay_brackets', 'glyp-payment', 'glyp-payment_ach', 'glyp-payment_application_apply', 'glyp-payment_application_correction', 'glyp-payment_application_initial', 'glyp-payment_application_refund', 'glyp-payment_application_transfer', 'glyp-payment_application_unapply', 'glyp-payment_application_unapply_all', 'glyp-payment_applications', 'glyp-payment_batch', 'glyp-payment_cash', 'glyp-payment_check', 'glyp-payment_coupon', 'glyp-payment_credit', 'glyp-payment_discount', 'glyp-payment_eft', 'glyp-payment_finance_charge', 'glyp-payments', 'glyp-payroll', 'glyp-pdf', 'glyp-pending', 'glyp-periodic', 'glyp-periodic_assessment', 'glyp-permission', 'glyp-pest', 'glyp-pest_ants', 'glyp-pest_bats', 'glyp-pest_bed_bugs', 'glyp-pest_birds', 'glyp-pest_crawling_insects', 'glyp-pest_dermestids', 'glyp-pest_fall_invaders', 'glyp-pest_flying_insects', 'glyp-pest_moles', 'glyp-pest_mosquitoes', 'glyp-pest_nuisance_animals', 'glyp-pest_ornamental', 'glyp-pest_ornamental_diseases', 'glyp-pest_roaches', 'glyp-pest_rodents', 'glyp-pest_scorpions', 'glyp-pest_snakes', 'glyp-pest_spiders', 'glyp-pest_stinging_insects', 'glyp-pest_stored_product_pests', 'glyp-pest_ticks_and_fleas', 'glyp-pest_viruses_and_bacteria', 'glyp-pest_weeds', 'glyp-pest_wood_destroyers', 'glyp-phone', 'glyp-pick_date', 'glyp-pick_list', 'glyp-platform_android', 'glyp-platform_ios', 'glyp-platform_macos', 'glyp-platform_windows', 'glyp-play', 'glyp-plus', 'glyp-plus_filled', 'glyp-plus_outline', 'glyp-portal', 'glyp-price_increase', 'glyp-price_increase_alt', 'glyp-pricing_table', 'glyp-print', 'glyp-privacy', 'glyp-product_sale', 'glyp-production', 'glyp-professional_consultation', 'glyp-program', 'glyp-program_elements', 'glyp-program_initiation', 'glyp-program_order', 'glyp-program_review', 'glyp-promo', 'glyp-proposal', 'glyp-protection', 'glyp-purchase_order', 'glyp-quality', 'glyp-query', 'glyp-radio_checked', 'glyp-radio_empty', 'glyp-reassign', 'glyp-receipt', 'glyp-recent', 'glyp-recommendation', 'glyp-record_details', 'glyp-recurring_revenue', 'glyp-redo', 'glyp-refresh', 'glyp-refund', 'glyp-region', 'glyp-released', 'glyp-remove', 'glyp-renewal', 'glyp-report', 'glyp-required_input', 'glyp-reschedule', 'glyp-restaurant_bar', 'glyp-revenue', 'glyp-review', 'glyp-rfid', 'glyp-ride_along', 'glyp-rodent_exclusion', 'glyp-route_change', 'glyp-route_optimization', 'glyp-rows', 'glyp-ruler', 'glyp-sales', 'glyp-sales_contest', 'glyp-sales_pipeline', 'glyp-sales_tax', 'glyp-sales_tax_exemption', 'glyp-schedule_lock', 'glyp-schedule_lock_afternoon', 'glyp-schedule_lock_day', 'glyp-schedule_lock_exact', 'glyp-schedule_lock_four_hour', 'glyp-schedule_lock_morning', 'glyp-schedule_lock_none', 'glyp-schedule_lock_two_day', 'glyp-schedule_lock_two_hour', 'glyp-schedule_lock_week', 'glyp-schedule_tyoe_every', 'glyp-schedule_type_every', 'glyp-schedule_type_none', 'glyp-schedule_type_on_demand', 'glyp-schedule_type_schedule', 'glyp-scheduled', 'glyp-scheduling', 'glyp-school_church', 'glyp-script', 'glyp-search', 'glyp-seeding', 'glyp-segment', 'glyp-sent', 'glyp-sentricon', 'glyp-service_agreement', 'glyp-service_digest', 'glyp-service_form', 'glyp-service_miscellaneous', 'glyp-service_reminder', 'glyp-service_report', 'glyp-service_request', 'glyp-services', 'glyp-settings', 'glyp-setup', 'glyp-signature', 'glyp-simulator', 'glyp-site_map', 'glyp-site_map_annotation', 'glyp-site_map_chemical', 'glyp-site_map_edit_details', 'glyp-site_map_edit_geo', 'glyp-site_map_equipment', 'glyp-site_map_exterior', 'glyp-site_map_foundation', 'glyp-site_map_icon', 'glyp-site_map_interior', 'glyp-site_map_label', 'glyp-site_map_perimeter', 'glyp-site_map_settings_left', 'glyp-site_map_settings_right', 'glyp-site_map_template', 'glyp-skip', 'glyp-smart_traps', 'glyp-sms', 'glyp-snow_removal', 'glyp-sort', 'glyp-special', 'glyp-split', 'glyp-spp_scorecard', 'glyp-square_edge', 'glyp-start_sheet', 'glyp-start_time', 'glyp-statement', 'glyp-states', 'glyp-sticky', 'glyp-stop_time', 'glyp-store_material', 'glyp-store_order', 'glyp-store_order_back_order', 'glyp-store_order_cancelled', 'glyp-store_order_complete', 'glyp-store_order_pending', 'glyp-store_order_pending_return', 'glyp-store_order_pre_order', 'glyp-store_order_returned', 'glyp-stores', 'glyp-styling', 'glyp-subscribe', 'glyp-supplemental', 'glyp-support', 'glyp-sync', 'glyp-table', 'glyp-tablet', 'glyp-tablets', 'glyp-tag_manager', 'glyp-tags', 'glyp-task_runs', 'glyp-tech_pest_sightings', 'glyp-technician', 'glyp-technician_approach', 'glyp-template', 'glyp-termite_fumigation', 'glyp-terrier', 'glyp-terrier_hub', 'glyp-territory', 'glyp-text', 'glyp-thermometer', 'glyp-third_party_billing', 'glyp-threshold', 'glyp-ticket', 'glyp-ticket_type', 'glyp-tickets', 'glyp-tidy', 'glyp-time', 'glyp-time_entry', 'glyp-timeline', 'glyp-toolbox', 'glyp-tqi', 'glyp-tracker', 'glyp-tracking', 'glyp-training_course', 'glyp-treatment_split', 'glyp-trends', 'glyp-trip_charge', 'glyp-ui_type', 'glyp-unarchive', 'glyp-unchecked', 'glyp-undo', 'glyp-unfavorite', 'glyp-unit_sweep', 'glyp-unit_tag', 'glyp-university', 'glyp-unlocked', 'glyp-unmute', 'glyp-unscheduled', 'glyp-update_check_positions', 'glyp-upload', 'glyp-user', 'glyp-user_credit', 'glyp-user_tags', 'glyp-users', 'glyp-utility', 'glyp-vacation', 'glyp-vacuum', 'glyp-variant', 'glyp-vendor', 'glyp-versions', 'glyp-video', 'glyp-visible', 'glyp-warehouse', 'glyp-wdo', 'glyp-web_dusting', 'glyp-website', 'glyp-wildlife', 'glyp-wildlife_exclusion', 'glyp-winter_check', 'glyp-wizard', 'glyp-work', 'glyp-work_class', 'glyp-work_code', 'glyp-work_order', 'glyp-work_production', 'glyp-work_progress', 'glyp-work_yield', 'glyp-year', 'glyp-yield', 'glyp-zip_code', 'glyp-zone_adjacent', 'glyp-zone_check', 'glyp-zone_production', 'glyp-zone_remote', 'glyp-zoom_fit'] as const
5
+ const names = ['glyp-abacus', 'glyp-account', 'glyp-accounts_payable', 'glyp-accounts_receivable', 'glyp-action_log', 'glyp-activate', 'glyp-activate_user', 'glyp-active', 'glyp-activity_high', 'glyp-activity_low', 'glyp-activity_medium', 'glyp-activity_none', 'glyp-address1', 'glyp-adjustment', 'glyp-admin', 'glyp-administration', 'glyp-affinity', 'glyp-agency', 'glyp-air_freshener', 'glyp-alert', 'glyp-align_horizontal', 'glyp-align_vertical', 'glyp-anchor', 'glyp-android_phone', 'glyp-android_tablet', 'glyp-annotation', 'glyp-announcement', 'glyp-app_update', 'glyp-append_selection', 'glyp-appointment', 'glyp-appointment_setup', 'glyp-archive', 'glyp-arrow_down', 'glyp-arrow_left', 'glyp-arrow_right', 'glyp-arrow_transfer', 'glyp-arrow_up', 'glyp-ascending', 'glyp-assign', 'glyp-assign_all', 'glyp-attachment', 'glyp-audit', 'glyp-audit_analyzer', 'glyp-audits', 'glyp-autopay', 'glyp-availability', 'glyp-background_batch', 'glyp-background_job', 'glyp-bait_for_demolition', 'glyp-bar_chart', 'glyp-barcode', 'glyp-bat_exclusion', 'glyp-bed_bug_fumigation', 'glyp-begin_service', 'glyp-belongs_to', 'glyp-billing', 'glyp-billing_office', 'glyp-billing_terms', 'glyp-billto', 'glyp-bioremediation', 'glyp-bird_exclusion', 'glyp-black_light', 'glyp-bookmark', 'glyp-branch', 'glyp-branch_bats', 'glyp-branch_birds', 'glyp-branch_general', 'glyp-branch_irrigation', 'glyp-branch_landscape', 'glyp-branch_multi_housing', 'glyp-branch_office', 'glyp-branch_orders', 'glyp-branch_residential', 'glyp-branch_sales', 'glyp-branch_termites', 'glyp-branch_weeds', 'glyp-branch_wildlife', 'glyp-build', 'glyp-business', 'glyp-business_cert', 'glyp-business_cert_type', 'glyp-calculate', 'glyp-calendar', 'glyp-calendar_branch', 'glyp-calendar_map', 'glyp-calendar_rolling', 'glyp-calendar_share', 'glyp-calendar_snap', 'glyp-california', 'glyp-call', 'glyp-callback', 'glyp-camera', 'glyp-canada', 'glyp-cancellation', 'glyp-cancelled', 'glyp-card_american_express', 'glyp-card_discover', 'glyp-card_mastercard', 'glyp-card_visa', 'glyp-catalog', 'glyp-category', 'glyp-caught', 'glyp-cellulose_debris', 'glyp-cert', 'glyp-cert_timeline', 'glyp-cert_type', 'glyp-certificate', 'glyp-certified_summary', 'glyp-certs', 'glyp-ceu', 'glyp-check_all', 'glyp-check_in', 'glyp-check_in_service', 'glyp-checked', 'glyp-checked_check_all', 'glyp-checked_empty', 'glyp-checkmark', 'glyp-checkmark_filled', 'glyp-checkout', 'glyp-chemical', 'glyp-chemical_authorization', 'glyp-chemical_backpack_sprayer', 'glyp-chemical_biological_controls', 'glyp-chemical_disinfectant', 'glyp-chemical_fertilizer', 'glyp-chemical_flying_insect_bait', 'glyp-chemical_fumigants', 'glyp-chemical_insect_aerosol', 'glyp-chemical_insect_bait', 'glyp-chemical_insect_dust', 'glyp-chemical_insect_granules', 'glyp-chemical_insect_spray', 'glyp-chemical_label', 'glyp-chemical_mole_bait', 'glyp-chemical_pest_bird_control', 'glyp-chemical_pheromone_products', 'glyp-chemical_power_sprayer', 'glyp-chemical_rodenticide_block', 'glyp-chemical_rodenticide_non_block', 'glyp-chemical_sds', 'glyp-chemical_tree_products', 'glyp-chemical_weed_control', 'glyp-chemical_wildlife_repellents', 'glyp-chemical_wildlife_toxicants', 'glyp-chevron_down', 'glyp-chevron_left', 'glyp-chevron_right', 'glyp-chevron_up', 'glyp-circle', 'glyp-city', 'glyp-click', 'glyp-client_actions', 'glyp-client_pest_sightings', 'glyp-client_required', 'glyp-clipboard', 'glyp-close', 'glyp-close_empty', 'glyp-cloud', 'glyp-clypboard', 'glyp-clypedia', 'glyp-clypmart', 'glyp-code', 'glyp-code_details', 'glyp-collections', 'glyp-columns', 'glyp-comment', 'glyp-comment_filled', 'glyp-comments', 'glyp-commission_origin', 'glyp-commissions', 'glyp-company_setup', 'glyp-compass', 'glyp-complete', 'glyp-complete_certificate', 'glyp-complete_enrollment', 'glyp-condition_appliance_machinery', 'glyp-condition_customer', 'glyp-condition_device', 'glyp-condition_door_window', 'glyp-condition_dumpster', 'glyp-condition_entry_point', 'glyp-condition_evidence', 'glyp-condition_exclusion', 'glyp-condition_exterior', 'glyp-condition_interior', 'glyp-condition_plumbing', 'glyp-condition_prep_storage', 'glyp-condition_rodent_evidence', 'glyp-condition_rodent_exclusion', 'glyp-condition_roof_ceiling', 'glyp-condition_structure', 'glyp-condition_supplies', 'glyp-condition_termites', 'glyp-condition_ventilation', 'glyp-condition_wall_floor', 'glyp-condition_wildlife', 'glyp-conditions', 'glyp-consolidate', 'glyp-construction', 'glyp-continuing_ed', 'glyp-contract', 'glyp-contract_cancellation', 'glyp-contract_overview', 'glyp-conversation', 'glyp-copesan', 'glyp-copy', 'glyp-credit_memo', 'glyp-credit_non_revenue', 'glyp-credit_production', 'glyp-credit_prospect', 'glyp-credit_sales_bonus', 'glyp-crew', 'glyp-cumulative', 'glyp-curriculum', 'glyp-cursor', 'glyp-custom_form', 'glyp-customer', 'glyp-customer_service', 'glyp-damage', 'glyp-dashboard', 'glyp-data_dive', 'glyp-data_dive_query', 'glyp-data_dives', 'glyp-database', 'glyp-deactivate_user', 'glyp-dead_animal_removal', 'glyp-default', 'glyp-delete', 'glyp-demo_mode', 'glyp-descending', 'glyp-design', 'glyp-desktop', 'glyp-detail_report', 'glyp-developer', 'glyp-device', 'glyp-device_sync', 'glyp-differential', 'glyp-disable', 'glyp-disabled_filled', 'glyp-distribute_horizontal', 'glyp-distribute_vertical', 'glyp-division', 'glyp-document', 'glyp-documentation', 'glyp-documents', 'glyp-download', 'glyp-driving', 'glyp-duplicate', 'glyp-duplicate_location', 'glyp-duration', 'glyp-earth_to_wood', 'glyp-edit', 'glyp-email', 'glyp-employment', 'glyp-entertainment_public_venues', 'glyp-equipment_bear_trap', 'glyp-equipment_flying_insect_bait_station', 'glyp-equipment_flying_insect_light_trap', 'glyp-equipment_insect_monitor', 'glyp-equipment_lethal_animal_trap', 'glyp-equipment_live_animal_trap', 'glyp-equipment_live_rodent_trap', 'glyp-equipment_maintenance', 'glyp-equipment_map_viewer', 'glyp-equipment_maps', 'glyp-equipment_mosquito_trap', 'glyp-equipment_other', 'glyp-equipment_pheromone_trap', 'glyp-equipment_pick_up', 'glyp-equipment_rodent_bait', 'glyp-equipment_rodent_trap', 'glyp-equipment_termite_bait_station', 'glyp-equipment_termite_monitor', 'glyp-escape', 'glyp-exam', 'glyp-exams', 'glyp-exclusion', 'glyp-existing_location', 'glyp-expand', 'glyp-expired', 'glyp-expiring', 'glyp-exterior', 'glyp-extras', 'glyp-facebook', 'glyp-family', 'glyp-farm', 'glyp-farm_grain_seed', 'glyp-fast_and_frequent', 'glyp-favorite', 'glyp-features', 'glyp-feedback', 'glyp-field_guide', 'glyp-field_training', 'glyp-file_blank', 'glyp-file_html', 'glyp-file_image', 'glyp-file_pdf', 'glyp-file_printable', 'glyp-file_spreadsheet', 'glyp-file_text', 'glyp-filter', 'glyp-finance', 'glyp-finding', 'glyp-fogging', 'glyp-folder', 'glyp-followup', 'glyp-food_bev_pharma', 'glyp-formula', 'glyp-fuel', 'glyp-fumigation', 'glyp-function', 'glyp-function_aggregate', 'glyp-function_time', 'glyp-gain_loss', 'glyp-generate_invoices', 'glyp-generate_orders', 'glyp-geo', 'glyp-geo_heat_map', 'glyp-google', 'glyp-google_calendar', 'glyp-government', 'glyp-grain_seed', 'glyp-grid', 'glyp-grouped', 'glyp-grouping_combine', 'glyp-grouping_separate', 'glyp-guide', 'glyp-has_many', 'glyp-health_care', 'glyp-heat_map', 'glyp-heat_treatment', 'glyp-help', 'glyp-hidden', 'glyp-hint', 'glyp-home', 'glyp-honeybee_removal', 'glyp-housing', 'glyp-icon', 'glyp-identifier', 'glyp-image', 'glyp-images', 'glyp-import', 'glyp-import_certs', 'glyp-import_data', 'glyp-import_users', 'glyp-in_progress', 'glyp-inbox', 'glyp-incomplete_certificate', 'glyp-industrial', 'glyp-info', 'glyp-information_technology', 'glyp-inspect_map', 'glyp-inspections', 'glyp-insulation', 'glyp-interior', 'glyp-invoice', 'glyp-invoice_charge', 'glyp-invoice_credit', 'glyp-invoice_paid', 'glyp-invoice_review', 'glyp-ipad', 'glyp-iphone', 'glyp-irrigation_install', 'glyp-irrigation_maintenance', 'glyp-items', 'glyp-job', 'glyp-job_plan', 'glyp-job_plan_history', 'glyp-job_plan_run', 'glyp-join', 'glyp-join_inner', 'glyp-join_left', 'glyp-jump', 'glyp-justice', 'glyp-k9_inspection', 'glyp-key', 'glyp-label_bottom', 'glyp-label_left', 'glyp-label_right', 'glyp-label_top', 'glyp-labor', 'glyp-landscape', 'glyp-landscape_maintenance', 'glyp-laptop', 'glyp-lead', 'glyp-lead_listing', 'glyp-lead_source', 'glyp-leads_report', 'glyp-learning_hub', 'glyp-ledger', 'glyp-legal', 'glyp-license', 'glyp-lifetime', 'glyp-limit', 'glyp-line_cap_arrow', 'glyp-line_cap_bar', 'glyp-line_cap_circle', 'glyp-line_cap_none', 'glyp-line_caps', 'glyp-line_style', 'glyp-link', 'glyp-list', 'glyp-location', 'glyp-location_charge', 'glyp-location_credit', 'glyp-location_import', 'glyp-location_kind', 'glyp-location_message', 'glyp-location_origin', 'glyp-location_seed', 'glyp-location_tags', 'glyp-locations', 'glyp-locked', 'glyp-lodging', 'glyp-log_in', 'glyp-log_out', 'glyp-log_report', 'glyp-logbook', 'glyp-logbook_documents', 'glyp-lot_number', 'glyp-lycensed_simulator', 'glyp-manager', 'glyp-manual', 'glyp-map', 'glyp-markdown', 'glyp-market', 'glyp-materials', 'glyp-mattress_encasement', 'glyp-merge', 'glyp-message_billing', 'glyp-message_collections', 'glyp-message_complaint', 'glyp-message_misc', 'glyp-message_technician', 'glyp-messages', 'glyp-minus_outline', 'glyp-misc', 'glyp-miscellaneous', 'glyp-missing', 'glyp-moisture', 'glyp-move_order', 'glyp-mowing', 'glyp-multi_housing', 'glyp-multi_tech_order', 'glyp-mute', 'glyp-navicon', 'glyp-new_location', 'glyp-new_ticket', 'glyp-no_charge', 'glyp-no_service', 'glyp-note', 'glyp-note_access', 'glyp-note_billing', 'glyp-note_collection', 'glyp-note_complaint', 'glyp-note_directions', 'glyp-note_focused', 'glyp-note_office', 'glyp-note_preservice', 'glyp-note_sales', 'glyp-note_service', 'glyp-notification', 'glyp-nuke', 'glyp-number', 'glyp-occupant', 'glyp-office', 'glyp-office_government', 'glyp-office_training', 'glyp-on_demand', 'glyp-on_demand_order', 'glyp-open', 'glyp-open_invoice', 'glyp-operations', 'glyp-options', 'glyp-order_actions', 'glyp-order_approved', 'glyp-order_batch', 'glyp-order_editor', 'glyp-order_pending', 'glyp-order_series', 'glyp-order_unapproved', 'glyp-org', 'glyp-org_feature', 'glyp-org_settings', 'glyp-org_structure', 'glyp-org_unit', 'glyp-org_unit_settings', 'glyp-orgs', 'glyp-origin', 'glyp-origin_client', 'glyp-origin_tech', 'glyp-outbox', 'glyp-outlier', 'glyp-outlook', 'glyp-overlap', 'glyp-password', 'glyp-past_due', 'glyp-pause', 'glyp-paused', 'glyp-pay_brackets', 'glyp-payment', 'glyp-payment_ach', 'glyp-payment_application_apply', 'glyp-payment_application_correction', 'glyp-payment_application_initial', 'glyp-payment_application_refund', 'glyp-payment_application_transfer', 'glyp-payment_application_unapply', 'glyp-payment_application_unapply_all', 'glyp-payment_applications', 'glyp-payment_batch', 'glyp-payment_cash', 'glyp-payment_check', 'glyp-payment_coupon', 'glyp-payment_credit', 'glyp-payment_discount', 'glyp-payment_eft', 'glyp-payment_finance_charge', 'glyp-payments', 'glyp-payroll', 'glyp-pdf', 'glyp-pending', 'glyp-periodic', 'glyp-periodic_assessment', 'glyp-permission', 'glyp-pest', 'glyp-pest_ants', 'glyp-pest_bats', 'glyp-pest_bed_bugs', 'glyp-pest_birds', 'glyp-pest_crawling_insects', 'glyp-pest_dermestids', 'glyp-pest_fall_invaders', 'glyp-pest_flying_insects', 'glyp-pest_moles', 'glyp-pest_mosquitoes', 'glyp-pest_nuisance_animals', 'glyp-pest_ornamental', 'glyp-pest_ornamental_diseases', 'glyp-pest_roaches', 'glyp-pest_rodents', 'glyp-pest_scorpions', 'glyp-pest_snakes', 'glyp-pest_spiders', 'glyp-pest_stinging_insects', 'glyp-pest_stored_product_pests', 'glyp-pest_ticks_and_fleas', 'glyp-pest_viruses_and_bacteria', 'glyp-pest_weeds', 'glyp-pest_wood_destroyers', 'glyp-phone', 'glyp-pick_date', 'glyp-pick_list', 'glyp-platform_android', 'glyp-platform_ios', 'glyp-platform_macos', 'glyp-platform_windows', 'glyp-play', 'glyp-plus', 'glyp-plus_filled', 'glyp-plus_outline', 'glyp-portal', 'glyp-price_increase', 'glyp-price_increase_alt', 'glyp-pricing', 'glyp-pricing_table', 'glyp-print', 'glyp-privacy', 'glyp-product_sale', 'glyp-production', 'glyp-professional_consultation', 'glyp-profile', 'glyp-program', 'glyp-program_elements', 'glyp-program_initiation', 'glyp-program_order', 'glyp-program_review', 'glyp-promo', 'glyp-proposal', 'glyp-protection', 'glyp-purchase_order', 'glyp-quality', 'glyp-query', 'glyp-radio_checked', 'glyp-radio_empty', 'glyp-reassign', 'glyp-receipt', 'glyp-recent', 'glyp-reciprocity', 'glyp-recommendation', 'glyp-record_details', 'glyp-recurring_revenue', 'glyp-redo', 'glyp-refresh', 'glyp-refund', 'glyp-region', 'glyp-released', 'glyp-remove', 'glyp-renew', 'glyp-renewal', 'glyp-report', 'glyp-required_input', 'glyp-reschedule', 'glyp-restaurant_bar', 'glyp-revenue', 'glyp-review', 'glyp-rfid', 'glyp-ride_along', 'glyp-rodent_exclusion', 'glyp-role_admin', 'glyp-role_customer', 'glyp-role_super', 'glyp-role_tech', 'glyp-roster', 'glyp-route_change', 'glyp-route_optimization', 'glyp-rows', 'glyp-ruby', 'glyp-ruler', 'glyp-sales', 'glyp-sales_contest', 'glyp-sales_pipeline', 'glyp-sales_tax', 'glyp-sales_tax_exemption', 'glyp-schedule_lock', 'glyp-schedule_lock_afternoon', 'glyp-schedule_lock_day', 'glyp-schedule_lock_exact', 'glyp-schedule_lock_four_hour', 'glyp-schedule_lock_morning', 'glyp-schedule_lock_none', 'glyp-schedule_lock_two_day', 'glyp-schedule_lock_two_hour', 'glyp-schedule_lock_week', 'glyp-schedule_tyoe_every', 'glyp-schedule_type_every', 'glyp-schedule_type_none', 'glyp-schedule_type_on_demand', 'glyp-schedule_type_schedule', 'glyp-scheduled', 'glyp-scheduling', 'glyp-school_church', 'glyp-scope', 'glyp-scoreboard', 'glyp-scrape', 'glyp-script', 'glyp-search', 'glyp-seeding', 'glyp-segment', 'glyp-send', 'glyp-sent', 'glyp-sentricon', 'glyp-service_agreement', 'glyp-service_digest', 'glyp-service_form', 'glyp-service_form_new', 'glyp-service_form_settings', 'glyp-service_form_template', 'glyp-service_miscellaneous', 'glyp-service_reminder', 'glyp-service_report', 'glyp-service_request', 'glyp-services', 'glyp-settings', 'glyp-setup', 'glyp-signature', 'glyp-simulator', 'glyp-site_map', 'glyp-site_map_annotation', 'glyp-site_map_chemical', 'glyp-site_map_edit_details', 'glyp-site_map_edit_geo', 'glyp-site_map_equipment', 'glyp-site_map_exterior', 'glyp-site_map_foundation', 'glyp-site_map_icon', 'glyp-site_map_interior', 'glyp-site_map_label', 'glyp-site_map_perimeter', 'glyp-site_map_settings_left', 'glyp-site_map_settings_right', 'glyp-site_map_template', 'glyp-skill', 'glyp-skip', 'glyp-slope', 'glyp-smart_traps', 'glyp-sms', 'glyp-snow_removal', 'glyp-sort', 'glyp-special', 'glyp-split', 'glyp-spp_scorecard', 'glyp-square_edge', 'glyp-start_sheet', 'glyp-start_time', 'glyp-state_ak', 'glyp-state_al', 'glyp-state_ar', 'glyp-state_az', 'glyp-state_ca', 'glyp-state_co', 'glyp-state_ct', 'glyp-state_dc', 'glyp-state_de', 'glyp-state_fl', 'glyp-state_ga', 'glyp-state_hi', 'glyp-state_ia', 'glyp-state_id', 'glyp-state_il', 'glyp-state_in', 'glyp-state_ks', 'glyp-state_ky', 'glyp-state_la', 'glyp-state_ma', 'glyp-state_mb', 'glyp-state_md', 'glyp-state_me', 'glyp-state_mi', 'glyp-state_mn', 'glyp-state_mo', 'glyp-state_ms', 'glyp-state_mt', 'glyp-state_nc', 'glyp-state_nd', 'glyp-state_ne', 'glyp-state_nh', 'glyp-state_nj', 'glyp-state_nm', 'glyp-state_nv', 'glyp-state_ny', 'glyp-state_oh', 'glyp-state_ok', 'glyp-state_or', 'glyp-state_pa', 'glyp-state_ri', 'glyp-state_sc', 'glyp-state_sd', 'glyp-state_tn', 'glyp-state_tx', 'glyp-state_ut', 'glyp-state_va', 'glyp-state_vt', 'glyp-state_wa', 'glyp-state_wi', 'glyp-state_wv', 'glyp-state_wy', 'glyp-statement', 'glyp-states', 'glyp-steps', 'glyp-sticky', 'glyp-stop_time', 'glyp-store_material', 'glyp-store_order', 'glyp-store_order_back_order', 'glyp-store_order_cancelled', 'glyp-store_order_complete', 'glyp-store_order_pending', 'glyp-store_order_pending_return', 'glyp-store_order_pre_order', 'glyp-store_order_returned', 'glyp-stores', 'glyp-styling', 'glyp-subscribe', 'glyp-subscription', 'glyp-supplemental', 'glyp-support', 'glyp-sync', 'glyp-table', 'glyp-tablet', 'glyp-tablets', 'glyp-tag', 'glyp-tag_manager', 'glyp-tags', 'glyp-task_runs', 'glyp-taxability', 'glyp-tech_cert', 'glyp-tech_cert_type', 'glyp-tech_pest_sightings', 'glyp-technician', 'glyp-technician_approach', 'glyp-template', 'glyp-termite_fumigation', 'glyp-terrier', 'glyp-terrier_hub', 'glyp-territory', 'glyp-text', 'glyp-thermometer', 'glyp-third_party', 'glyp-third_party_billing', 'glyp-threshold', 'glyp-ticket', 'glyp-ticket_type', 'glyp-tickets', 'glyp-tidy', 'glyp-time', 'glyp-time_entry', 'glyp-timeline', 'glyp-timer', 'glyp-toolbox', 'glyp-tqi', 'glyp-tracker', 'glyp-tracking', 'glyp-training_course', 'glyp-treatment_split', 'glyp-trends', 'glyp-trial', 'glyp-trip_charge', 'glyp-ui_type', 'glyp-unarchive', 'glyp-unassign', 'glyp-unassign_all', 'glyp-unchecked', 'glyp-undo', 'glyp-unfavorite', 'glyp-unit_sweep', 'glyp-unit_tag', 'glyp-university', 'glyp-unlocked', 'glyp-unmute', 'glyp-unscheduled', 'glyp-update_check_positions', 'glyp-upload', 'glyp-user', 'glyp-user_credit', 'glyp-user_tags', 'glyp-users', 'glyp-utility', 'glyp-vacation', 'glyp-vacuum', 'glyp-variant', 'glyp-vendor', 'glyp-versions', 'glyp-video', 'glyp-visible', 'glyp-warehouse', 'glyp-wdi', 'glyp-wdi_az', 'glyp-wdi_ca', 'glyp-wdi_npma', 'glyp-wdi_nv', 'glyp-wdo', 'glyp-web_dusting', 'glyp-website', 'glyp-wildlife', 'glyp-wildlife_exclusion', 'glyp-winter_check', 'glyp-wizard', 'glyp-work', 'glyp-work_class', 'glyp-work_code', 'glyp-work_order', 'glyp-work_production', 'glyp-work_progress', 'glyp-work_yield', 'glyp-year', 'glyp-yield', 'glyp-zip_code', 'glyp-zone_adjacent', 'glyp-zone_check', 'glyp-zone_production', 'glyp-zone_remote', 'glyp-zoom', 'glyp-zoom_fit'] as const
6
6
 
7
7
  /**
8
8
  * Format a glyp name so that it's suitable to show to the user.
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="currentColor" fill-rule="nonzero"><path d="M27.314 4.686a5 5 0 0 1 0 7.071l-6.364 6.364a5.05 5.05 0 0 1-.47.415 5.99 5.99 0 0 0-.098-2.674l5.517-5.519a3 3 0 1 0-4.242-4.242l-6.364 6.363a3 3 0 0 0 1.29 5.005A1.985 1.985 0 0 1 16 18.83l-.412.413a5 5 0 0 1-1.709-8.191l6.364-6.365a5 5 0 0 1 7.07 0Z"/><path d="M4.686 27.314a5 5 0 0 1 0-7.071l6.364-6.364c.15-.15.307-.288.47-.415a5.99 5.99 0 0 0 .098 2.675L6.1 21.657a3 3 0 0 0 4.242 4.242l6.364-6.363a3 3 0 0 0-1.29-5.005c.011-.493.206-.983.583-1.36l.413-.412a5 5 0 0 1 1.708 8.19l-6.364 6.365a5 5 0 0 1-7.07 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><path fill="currentColor" fill-opacity="0.33" fill-rule="nonzero" d="M5 5h22v22H5z"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M27 27H5V5"/><path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 22 4.4-4 4.4 2 4.4-7 4.4 4L27 9"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="#000" fill-rule="nonzero"><path d="M27.314 4.686a5 5 0 0 1 0 7.071l-6.364 6.364a5.05 5.05 0 0 1-.47.415 5.99 5.99 0 0 0-.098-2.674l5.517-5.519a3 3 0 1 0-4.242-4.242l-6.364 6.363a3 3 0 0 0 1.29 5.005A1.985 1.985 0 0 1 16 18.83l-.412.413a5 5 0 0 1-1.709-8.191l6.364-6.365a5 5 0 0 1 7.07 0Z"/><path d="M4.686 27.314a5 5 0 0 1 0-7.071l6.364-6.364c.15-.15.307-.288.47-.415a5.99 5.99 0 0 0 .098 2.675L6.1 21.657a3 3 0 0 0 4.242 4.242l6.364-6.363a3 3 0 0 0-1.29-5.005c.011-.493.206-.983.583-1.36l.413-.412a5 5 0 0 1 1.708 8.19l-6.364 6.365a5 5 0 0 1-7.07 0Z"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none" fill-rule="evenodd"><path fill="#000" fill-opacity=".25" fill-rule="nonzero" d="M5 5h22v22H5z"/><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M27 27H5V5"/><path stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m5 22 4.4-4 4.4 2 4.4-7 4.4 4L27 9"/></g></svg>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-link</title>
4
+ <g id="icon-link" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <g id="Group" transform="translate(16, 16) rotate(45) translate(-16, -16)translate(11, 0)" fill="#000000" fill-rule="nonzero">
6
+ <path d="M5,0 C7.76142375,0 10,2.23857625 10,5 L10,14 C10,14.2118371 9.98682623,14.4205974 9.96125326,14.6255061 C9.74907057,14.3133626 9.50824898,14.0229676 9.24264069,13.7573593 C8.87334228,13.3880609 8.4561268,13.0666796 8.00112026,12.8033414 L8,5 C8,3.34314575 6.65685425,2 5,2 C3.34314575,2 2,3.34314575 2,5 L2,14 C2,15.6568542 3.34314575,17 5,17 C5.5265222,17 6.02136396,16.86436 6.45148858,16.6261166 C6.79165627,16.9830537 7,17.4671962 7,18 L7.0005324,18.5837237 C6.38792967,18.8514665 5.71131077,19 5,19 C2.23857625,19 0,16.7614237 0,14 L0,5 C0,2.23857625 2.23857625,0 5,0 Z" id="Rectangle"></path>
7
+ <path d="M5,13 C7.76142375,13 10,15.2385763 10,18 L10,27 C10,27.2118371 9.98682623,27.4205974 9.96125326,27.6255061 C9.74907057,27.3133626 9.50824898,27.0229676 9.24264069,26.7573593 C8.87306934,26.387788 8.45551005,26.0662045 8.00011131,25.8027576 L8,18 C8,16.3431458 6.65685425,15 5,15 C3.34314575,15 2,16.3431458 2,18 L2,27 C2,28.6568542 3.34314575,30 5,30 C5.5265222,30 6.02136396,29.86436 6.45148858,29.6261166 C6.79165627,29.9830537 7,30.4671962 7,31 L6.99953894,31.5841577 C6.38719818,31.851627 5.71092628,32 5,32 C2.23857625,32 -1.15463195e-13,29.7614237 -1.15463195e-13,27 L-1.15463195e-13,18 C-1.15463195e-13,15.2385763 2.23857625,13 5,13 Z" id="Rectangle-Copy" transform="translate(5, 22.5) rotate(180) translate(-5, -22.5)"></path>
8
+ </g>
9
+ </g>
10
+ </svg>
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>icon-plot</title>
4
+ <g id="icon-plot" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <rect id="Rectangle" fill-opacity="0.25" fill="#000000" fill-rule="nonzero" x="5" y="5" width="22" height="22"></rect>
6
+ <polyline id="axes" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" points="27 27 5 27 5 5"></polyline>
7
+ <polyline id="Path-103" stroke="#000000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" points="5 22 9.4 18 13.8 20 18.2 13 22.6 17 27 9"></polyline>
8
+ </g>
9
+ </svg>
@@ -150,8 +150,6 @@ export default abstract class PagePart<TState> extends ContentPart<TState> {
150
150
  if (!this._breadcrumbs.length && !this._title?.length) return
151
151
 
152
152
  parent.h1('.breadcrumbs', h1 => {
153
- const crumbs = Array.from(this._breadcrumbs)
154
-
155
153
  // add a breadcrumb for the page title
156
154
  if (this._title?.length) {
157
155
  const titleCrumb: Action = {
@@ -164,10 +162,10 @@ export default abstract class PagePart<TState> extends ContentPart<TState> {
164
162
  if (this._titleClasses?.length) {
165
163
  titleCrumb.classes = this._titleClasses
166
164
  }
167
- crumbs.push(titleCrumb)
165
+ this.addBreadcrumb(titleCrumb)
168
166
  }
169
167
 
170
- this.app.theme.renderActions(h1, crumbs)
168
+ this.app.theme.renderActions(h1, Array.from(this._breadcrumbs))
171
169
  })
172
170
  }
173
171