vue-girder-slicer-cli-ui 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +102 -0
  2. package/dist/api/girderRest.d.ts +36 -0
  3. package/dist/api/girderSlicerApi.d.ts +32 -0
  4. package/dist/components/FileBrowser/DataBrowser.tw.vue.d.ts +177 -0
  5. package/dist/components/FileBrowser/Modal.tw.vue.d.ts +27 -0
  6. package/dist/components/FileBrowser/RootSelection.tw.vue.d.ts +41 -0
  7. package/dist/components/FileBrowser/utils.d.ts +9 -0
  8. package/dist/components/GirderControlsPanel.tw.vue.d.ts +29 -0
  9. package/dist/components/GirderSlicerParameter.tw.vue.d.ts +50 -0
  10. package/dist/components/GirderSlicerTaskButton.tw.vue.d.ts +42 -0
  11. package/dist/components/GirderSlicerTaskCard.tw.vue.d.ts +44 -0
  12. package/dist/components/GirderSlicerTaskMenu.tw.vue.d.ts +49 -0
  13. package/dist/components/GlicerSlicerTaskMenuModal.tw.vue.d.ts +34 -0
  14. package/dist/components/GlicerSlicerTaskMenuModalButton.tw.vue.d.ts +38 -0
  15. package/dist/components/GriderSlicerTasksIntegrated.tw.vue.d.ts +74 -0
  16. package/dist/components/Parameters/BaseParameter.tw.vue.d.ts +21 -0
  17. package/dist/components/Parameters/BooleanParameter.tw.vue.d.ts +18 -0
  18. package/dist/components/Parameters/ColorParameter.tw.vue.d.ts +19 -0
  19. package/dist/components/Parameters/EnumerationParameters.tw.vue.d.ts +19 -0
  20. package/dist/components/Parameters/FileParameter.tw.vue.d.ts +32 -0
  21. package/dist/components/Parameters/RangeParameter.tw.vue.d.ts +19 -0
  22. package/dist/favicon.ico +0 -0
  23. package/dist/girderTypes.d.ts +21 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/parser/constraints.d.ts +4 -0
  26. package/dist/parser/convert.d.ts +7 -0
  27. package/dist/parser/defaultValue.d.ts +12 -0
  28. package/dist/parser/group.d.ts +9 -0
  29. package/dist/parser/index.d.ts +8 -0
  30. package/dist/parser/panel.d.ts +11 -0
  31. package/dist/parser/param.d.ts +6 -0
  32. package/dist/parser/parse.d.ts +20 -0
  33. package/dist/parser/parserTypes.d.ts +58 -0
  34. package/dist/parser/widget.d.ts +6 -0
  35. package/dist/style.css +1 -0
  36. package/dist/tailwind.css +1370 -0
  37. package/dist/utils.d.ts +5 -0
  38. package/dist/vue-girder-slicer-cli-ui.js +12987 -0
  39. package/dist/vue-girder-slicer-cli-ui.umd.cjs +59 -0
  40. package/package.json +135 -0
  41. package/src/components/FileBrowser/DataBrowser.tw.vue +842 -0
  42. package/src/components/FileBrowser/Modal.tw.vue +82 -0
  43. package/src/components/FileBrowser/RootSelection.tw.vue +83 -0
  44. package/src/components/FileBrowser/utils.ts +48 -0
  45. package/src/components/GirderControlsPanel.tw.vue +94 -0
  46. package/src/components/GirderSlicerParameter.tw.vue +84 -0
  47. package/src/components/GirderSlicerTaskButton.tw.vue +208 -0
  48. package/src/components/GirderSlicerTaskCard.tw.vue +184 -0
  49. package/src/components/GirderSlicerTaskMenu.tw.vue +217 -0
  50. package/src/components/GlicerSlicerTaskMenuModal.tw.vue +77 -0
  51. package/src/components/GlicerSlicerTaskMenuModalButton.tw.vue +106 -0
  52. package/src/components/GriderSlicerTasksIntegrated.tw.vue +73 -0
  53. package/src/components/Parameters/BaseParameter.tw.vue +76 -0
  54. package/src/components/Parameters/BooleanParameter.tw.vue +54 -0
  55. package/src/components/Parameters/ColorParameter.tw.vue +58 -0
  56. package/src/components/Parameters/EnumerationParameters.tw.vue +66 -0
  57. package/src/components/Parameters/FileParameter.tw.vue +172 -0
  58. package/src/components/Parameters/RangeParameter.tw.vue +74 -0
@@ -0,0 +1,38 @@
1
+ import { PropType } from "vue/types/v3-component-props";
2
+ import { SlicerImage } from "../api/girderSlicerApi";
3
+ declare const _default: import("vue").DefineComponent<{
4
+ apiUrl: {
5
+ type: StringConstructor;
6
+ default: string;
7
+ };
8
+ filter: {
9
+ type: PropType<(task: SlicerImage) => boolean>;
10
+ default: (_task: SlicerImage) => true;
11
+ };
12
+ }, {
13
+ modalOpen: import("vue").Ref<boolean>;
14
+ accept: () => void;
15
+ processSelected: (data: {
16
+ id: string;
17
+ name: string;
18
+ }) => void;
19
+ clearSelection: () => void;
20
+ selected: import("vue").Ref<string>;
21
+ selectedId: import("vue").Ref<string>;
22
+ selectedName: import("vue").Ref<string>;
23
+ loggedIn: import("vue").ComputedRef<string | null>;
24
+ mdiAlert: string;
25
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
26
+ apiUrl: {
27
+ type: StringConstructor;
28
+ default: string;
29
+ };
30
+ filter: {
31
+ type: PropType<(task: SlicerImage) => boolean>;
32
+ default: (_task: SlicerImage) => true;
33
+ };
34
+ }>>, {
35
+ filter: (task: SlicerImage) => boolean;
36
+ apiUrl: string;
37
+ }>;
38
+ export default _default;
@@ -0,0 +1,74 @@
1
+ import { Ref, PropType } from 'vue';
2
+ import type { XMLParameters } from '../parser/parserTypes';
3
+ import { SlicerImage } from '../api/girderSlicerApi';
4
+ declare const _default: import("vue").DefineComponent<{
5
+ apiUrl: {
6
+ type: StringConstructor;
7
+ default: string;
8
+ };
9
+ filter: {
10
+ type: PropType<(task: SlicerImage) => boolean>;
11
+ default: (_task: SlicerImage) => true;
12
+ };
13
+ defaults: {
14
+ type: PropType<(item: XMLParameters) => undefined | null | XMLParameters>;
15
+ default: (_item: XMLParameters) => undefined;
16
+ };
17
+ }, {
18
+ selected: Ref<string | null>;
19
+ select: (id: string) => void;
20
+ cancel: () => void;
21
+ menuModelButton: Ref<import("vue").DefineComponent<{
22
+ apiUrl: {
23
+ type: StringConstructor;
24
+ default: string;
25
+ };
26
+ filter: {
27
+ type: import("vue/types/v3-component-props").PropType<(task: SlicerImage) => boolean>;
28
+ default: (_task: SlicerImage) => true;
29
+ };
30
+ }, {
31
+ modalOpen: Ref<boolean>;
32
+ accept: () => void;
33
+ processSelected: (data: {
34
+ id: string;
35
+ name: string;
36
+ }) => void;
37
+ clearSelection: () => void;
38
+ selected: Ref<string>;
39
+ selectedId: Ref<string>;
40
+ selectedName: Ref<string>;
41
+ loggedIn: import("vue").ComputedRef<string | null>;
42
+ mdiAlert: string;
43
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
44
+ apiUrl: {
45
+ type: StringConstructor;
46
+ default: string;
47
+ };
48
+ filter: {
49
+ type: import("vue/types/v3-component-props").PropType<(task: SlicerImage) => boolean>;
50
+ default: (_task: SlicerImage) => true;
51
+ };
52
+ }>>, {
53
+ filter: (task: SlicerImage) => boolean;
54
+ apiUrl: string;
55
+ }> | null>;
56
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
57
+ apiUrl: {
58
+ type: StringConstructor;
59
+ default: string;
60
+ };
61
+ filter: {
62
+ type: PropType<(task: SlicerImage) => boolean>;
63
+ default: (_task: SlicerImage) => true;
64
+ };
65
+ defaults: {
66
+ type: PropType<(item: XMLParameters) => undefined | null | XMLParameters>;
67
+ default: (_item: XMLParameters) => undefined;
68
+ };
69
+ }>>, {
70
+ filter: (task: SlicerImage) => boolean;
71
+ apiUrl: string;
72
+ defaults: (item: XMLParameters) => undefined | null | XMLParameters;
73
+ }>;
74
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import type { XMLBaseValue } from '../../parser/parserTypes';
3
+ import { XMLParameters } from '../../parser/parserTypes';
4
+ declare const _default: import("vue").DefineComponent<{
5
+ data: {
6
+ type: PropType<XMLParameters>;
7
+ required: true;
8
+ };
9
+ }, {
10
+ error: import("vue").ComputedRef<string | undefined>;
11
+ numberVectors: Ref<string[]>;
12
+ numbers: Ref<string[]>;
13
+ currentValue: Ref<XMLBaseValue>;
14
+ validate: (e: Event) => void;
15
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
16
+ data: {
17
+ type: PropType<XMLParameters>;
18
+ required: true;
19
+ };
20
+ }>>, {}>;
21
+ export default _default;
@@ -0,0 +1,18 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import { XMLParameters } from '../../parser/parserTypes';
3
+ declare const _default: import("vue").DefineComponent<{
4
+ data: {
5
+ type: PropType<XMLParameters>;
6
+ required: true;
7
+ };
8
+ }, {
9
+ error: import("vue").ComputedRef<string | undefined>;
10
+ currentValue: Ref<boolean>;
11
+ validate: (e: Event) => void;
12
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
13
+ data: {
14
+ type: PropType<XMLParameters>;
15
+ required: true;
16
+ };
17
+ }>>, {}>;
18
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import { XMLParameters } from '../../parser/parserTypes';
3
+ import type { XMLBaseValue } from '../../parser/parserTypes';
4
+ declare const _default: import("vue").DefineComponent<{
5
+ data: {
6
+ type: PropType<XMLParameters>;
7
+ required: true;
8
+ };
9
+ }, {
10
+ currentValue: Ref<XMLBaseValue>;
11
+ error: import("vue").ComputedRef<string | undefined>;
12
+ validate: (e: Event) => void;
13
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
14
+ data: {
15
+ type: PropType<XMLParameters>;
16
+ required: true;
17
+ };
18
+ }>>, {}>;
19
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import type { XMLBaseValue } from '../../parser/parserTypes';
3
+ import { XMLParameters } from '../../parser/parserTypes';
4
+ declare const _default: import("vue").DefineComponent<{
5
+ data: {
6
+ type: PropType<XMLParameters>;
7
+ required: true;
8
+ };
9
+ }, {
10
+ error: import("vue").ComputedRef<string | undefined>;
11
+ currentValue: Ref<XMLBaseValue>;
12
+ validate: (e: Event) => void;
13
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
14
+ data: {
15
+ type: PropType<XMLParameters>;
16
+ required: true;
17
+ };
18
+ }>>, {}>;
19
+ export default _default;
@@ -0,0 +1,32 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import { XMLParameters } from '../../parser/parserTypes';
3
+ declare const _default: import("vue").DefineComponent<{
4
+ data: {
5
+ type: PropType<XMLParameters>;
6
+ required: true;
7
+ };
8
+ }, {
9
+ error: import("vue").ComputedRef<string | undefined>;
10
+ currentValue: Ref<string | null>;
11
+ placeHolder: Ref<string>;
12
+ showBrowser: Ref<boolean>;
13
+ mdiFolderOpen: string;
14
+ mdiPlusThick: string;
15
+ batchload: Ref<boolean>;
16
+ girderId: Ref<string | undefined>;
17
+ parentId: Ref<string | undefined>;
18
+ selectedName: Ref<string | undefined>;
19
+ acceptBrowser: ({ name, girderId, parentId, regExp, fileId }: {
20
+ name: string;
21
+ girderId: string;
22
+ parentId: string;
23
+ regExp?: boolean;
24
+ fileId?: string;
25
+ }) => void;
26
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
27
+ data: {
28
+ type: PropType<XMLParameters>;
29
+ required: true;
30
+ };
31
+ }>>, {}>;
32
+ export default _default;
@@ -0,0 +1,19 @@
1
+ import { PropType, Ref } from 'vue';
2
+ import type { XMLBaseValue } from '../../parser/parserTypes';
3
+ import { XMLParameters } from '../../parser/parserTypes';
4
+ declare const _default: import("vue").DefineComponent<{
5
+ data: {
6
+ type: PropType<XMLParameters>;
7
+ required: true;
8
+ };
9
+ }, {
10
+ error: import("vue").ComputedRef<string | undefined>;
11
+ currentValue: Ref<XMLBaseValue>;
12
+ validate: (e: Event) => void;
13
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, Readonly<import("vue").ExtractPropTypes<{
14
+ data: {
15
+ type: PropType<XMLParameters>;
16
+ required: true;
17
+ };
18
+ }>>, {}>;
19
+ export default _default;
Binary file
@@ -0,0 +1,21 @@
1
+ type GirderModelType = 'item' | 'folder' | 'file' | 'user' | 'collection';
2
+ interface GirderModelBase {
3
+ name: string;
4
+ _id: string;
5
+ _modelType: GirderModelType;
6
+ created: string;
7
+ updated: string;
8
+ public: boolean;
9
+ parentId?: string | null;
10
+ meta: {
11
+ [key: string]: any;
12
+ };
13
+ [key: string]: any;
14
+ }
15
+ interface GirderModel extends GirderModelBase {
16
+ baseParentType: GirderModelType;
17
+ creatorId: string;
18
+ description: string;
19
+ parentCollection?: string;
20
+ }
21
+ export type { GirderModelType, GirderModelBase, GirderModel, };
@@ -0,0 +1,11 @@
1
+ import GirderSlicerTaskButton from "./components/GirderSlicerTaskButton.tw.vue";
2
+ import GirderSlicerTaskCard from "./components/GirderSlicerTaskCard.tw.vue";
3
+ import GirderDataBrowser from "./components/FileBrowser/DataBrowser.tw.vue";
4
+ import GirderRootSelection from "./components/FileBrowser/RootSelection.tw.vue";
5
+ import GirderSlicerTasksIntegrated from "./components/GriderSlicerTasksIntegrated.tw.vue";
6
+ import './tailwind.css';
7
+ declare const _default: {
8
+ install(app: any): void;
9
+ };
10
+ export default _default;
11
+ export { GirderSlicerTaskButton, GirderSlicerTaskCard, GirderDataBrowser, GirderRootSelection, GirderSlicerTasksIntegrated, };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Parse a `contraints` tag.
3
+ */
4
+ export default function constraints(type: string, constraintsTag: HTMLElement): Record<string, any>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Convert from a string to the given value type.
3
+ * @param {string} type A widget type
4
+ * @param {string} value The value to be converted
5
+ * @returns {*} The converted value
6
+ */
7
+ export default function convert(type: string, value: string): string | number | true | number[] | string[];
@@ -0,0 +1,12 @@
1
+ /// <reference types="jquery" />
2
+ /// <reference types="jquery" />
3
+ /**
4
+ * Parse a `default` tag returning an empty object when no default is given.
5
+ * If the default value appears to be a templated string, also return an
6
+ * empty object.
7
+ */
8
+ export default function defaultValue(type: string, value: JQuery<HTMLElement>): {
9
+ value: string | number | true | number[] | string[];
10
+ } | {
11
+ value?: undefined;
12
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Parse a parameter group (deliminated by <label> tags) within a
3
+ * panel.
4
+ */
5
+ export default function group(label: string, opts?: Record<string, any>): {
6
+ label: string;
7
+ description: string;
8
+ parameters: any[];
9
+ } | null;
@@ -0,0 +1,8 @@
1
+ export { default as constraints } from './constraints';
2
+ export { default as convert } from './convert';
3
+ export { default as defaultValue } from './defaultValue';
4
+ export { default as group } from './group';
5
+ export { default as panel } from './panel';
6
+ export { default as param } from './param';
7
+ export { default as parse } from './parse';
8
+ export { default as widget } from './widget';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Parse a <parameters> tag into a "panel" object.
3
+ */
4
+ export default function panel(panelTag: string, opts?: Record<string, any>): {
5
+ advanced: boolean;
6
+ groups: ({
7
+ label: string;
8
+ description: string;
9
+ parameters: any[];
10
+ } | null)[];
11
+ } | null;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Parse a parameter spec.
3
+ * @param {XML} param The parameter spec
4
+ * @returns {object}
5
+ */
6
+ export default function param(paramTag: any, opts?: Record<string, any>): any;
@@ -0,0 +1,20 @@
1
+ import { XMLSpecification } from './parserTypes';
2
+ /**
3
+ * This is a parser for Slicer's GUI Schema:
4
+ * https://www.slicer.org/slicerWiki/index.php/Slicer3:Execution_Model_Documentation#XML_Schema
5
+ */
6
+ /**
7
+ * Parse a Slicer GUI spec into a json object for rendering
8
+ * the controlsPanel view. This function parses into the following structure:
9
+ *
10
+ * * global metadata
11
+ * * panels[] -- each is rendered in a different panel
12
+ * * groups[] -- each is rendered together separated by a horizontal line
13
+ * * parameters[] -- individual parameters
14
+ *
15
+ * @param {string|object} spec The slicer GUI spec content (accepts parsed or unparsed xml)
16
+ * @param {object} [opts] When provided this object will used to provide information about
17
+ * the outputs of the spec.
18
+ * @returns {object}
19
+ */
20
+ export default function parse(spec: string | object, opts?: object): XMLSpecification;
@@ -0,0 +1,58 @@
1
+ export type ParamGUIType = 'number' | 'boolean' | 'string' | 'number-vector' | 'string-vector' | 'number-enumeration' | 'string-enumeration' | 'region' | 'image' | 'file' | 'item' | 'directory' | 'color' | 'multi';
2
+ export type ParamSlicerType = 'integer' | 'float' | 'double' | 'boolean' | 'string' | 'integer-vector' | 'float-vector' | 'double-vector' | 'string-vector' | 'integer-enumeration' | 'float-enumeration' | 'double-enumeration' | 'string-enumeration' | 'region' | 'image' | 'file' | 'item' | 'directory' | 'multi' | 'new-file';
3
+ export type XMLBaseValue = (number | string | number[] | string[] | boolean);
4
+ export interface XMLParameters {
5
+ type: ParamSlicerType;
6
+ slicerType: ParamGUIType;
7
+ title: string;
8
+ description: string;
9
+ channel?: 'input' | 'output';
10
+ id: string;
11
+ value?: XMLBaseValue;
12
+ values?: XMLBaseValue[];
13
+ constraints?: {
14
+ min?: XMLBaseValue;
15
+ max?: XMLBaseValue;
16
+ step?: XMLBaseValue;
17
+ };
18
+ defaultValue?: XMLBaseValue;
19
+ fileValue?: {
20
+ girderId: string;
21
+ name: string;
22
+ parentId: string;
23
+ regExp?: boolean | undefined;
24
+ fileId?: string | undefined;
25
+ };
26
+ required?: boolean;
27
+ extensions?: string | undefined;
28
+ reference?: string | undefined;
29
+ defaultNameMatch?: string | undefined;
30
+ defaultPathMatch?: string | undefined;
31
+ defaultRelativePath?: string | undefined;
32
+ multiple?: boolean;
33
+ datalist?: boolean;
34
+ shapes?: string | undefined;
35
+ error?: string | undefined;
36
+ }
37
+ export interface XMLGroups {
38
+ description: string;
39
+ label: string;
40
+ parameters: XMLParameters[];
41
+ }
42
+ export interface XMLPanel {
43
+ advanced: boolean;
44
+ groups: XMLGroups[];
45
+ }
46
+ export interface XMLSpecificationStrings {
47
+ title: string;
48
+ license: string;
49
+ description: string;
50
+ version: string;
51
+ 'documentation-url'?: string;
52
+ acknowledgements?: string;
53
+ contributor?: string;
54
+ }
55
+ export interface XMLSpecificationPanel {
56
+ panels: XMLPanel[];
57
+ }
58
+ export type XMLSpecification = XMLSpecificationStrings & XMLSpecificationPanel;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Mapping from slicer parameter specs to control widget types.
3
+ * @param {XML} param The full xml parameter spec
4
+ * @return {string} The widget type
5
+ */
6
+ export default function widget(param: any): string;
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ svg[data-v-76aa6b74]{transform:rotate(var(--r, 0deg)) scale(var(--sx, 1),var(--sy, 1))}path[data-v-76aa6b74]{fill:currentColor}.dropdown:hover>.dropdown-content[data-v-da513d4e]{display:block}.root-select[data-v-16a26624]{height:34px}.icon[data-v-2bec80c1]{color:var(--bs-heading-color)}.select-btn[data-v-2bec80c1]{border:1px solid gray;border-radius:0}.select-btn[data-v-2bec80c1]:hover{border:1px solid gray;background-color:#d3d3d3}.select-btn-multi[data-v-2bec80c1]{border:1px solid gray;border-radius:0 4px 4px 0}.select-btn-multi[data-v-2bec80c1]:hover{border:1px solid gray;background-color:#d3d3d3}a[data-v-cacb6a49]{color:#42b983}.icon[data-v-94c56404]:hover{cursor:pointer}.collapse-enter-active[data-v-94c56404]{animation:collapsing-94c56404 reverse .5s ease}.collapse-leave-active[data-v-94c56404]{animation:collapsing-94c56404 .5s ease}.pad-left[data-v-94c56404]{padding-left:15px}@keyframes collapsing-94c56404{0%{max-height:1000px}to{max-height:0px}}.dropdown:hover>.dropdown-content[data-v-c31cf4f1]{display:block}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.gsu-breadcrumb{border-left-width:2px;border-right-width:2px;border-top-width:2px;border-style:solid;border-color:var(--gsu-color-border);background-color:var(--gsu-color-background);color:var(--gsu-color-link)}.gsu-disabled-icon{color:var(--gsu-background-muted)}.gsu-disabled-icon:hover{cursor:default}.gsu-card{border-width:2px;border-color:var(--gsu-color-border);background-color:var(--gsu-color-background);color:var(--gsu-color-text)}.gsu-input{border-width:2px;border-style:solid;border-color:var(--gsu-color-border);background-color:var(--gsu-color-background)}.gsu-btn{border-width:2px;border-style:solid;border-color:var(--gsu-color-border);background-color:var(--gsu-color-background);color:var(--gsu-color-text)}.gsu-btn:hover{background-color:var(--gsu-background-muted)}.gsu-btn-accept{border-width:2px;border-style:solid;border-color:var(--gsu-color-border);color:var(--gsu-color-text)}.gsu-btn-accept:hover{cursor:pointer;background-color:var(--gsu-color-primary)}.gsu-btn-disabled{background-color:var(--gsu-background-muted);color:var(--gsu-color-muted-text)}.gsu-btn-disabled:hover{cursor:not-allowed;background-color:var(--gsu-color-background)}.gsu-icon{color:var(--gsu-color-link);display:inline}.gsu-clickable{color:var(--gsu-color-link)}.gsu-clickable:hover{cursor:pointer}.number-badge{position:relative;bottom:-10px;right:5px;font-size:10px}.gsu-item-row{border-left-width:2px;border-right-width:2px;border-top-width:2px;border-style:solid;border-color:var(--gsu-color-border)}.gsu-item-row:hover{cursor:pointer;background-color:var(--gsu-color-highlight)}.gsu-row-info{color:var(--gsu-color-text);padding-right:10px}.data-list{max-height:70vh;overflow-y:auto;overflow-x:hidden;border-bottom-width:2px;border-style:solid;border-color:var(--gsu-color-border)}.folder-header,.item-header{-webkit-user-select:none;-moz-user-select:none;user-select:none;border-left-width:2px;border-right-width:2px;border-top-width:2px;border-style:solid;border-color:var(--gsu-color-border)}.error-msg{font-weight:700;color:red}.gsu-selected-items{--tw-bg-opacity: 1;background-color:rgb(254 240 138 / var(--tw-bg-opacity))}.header{color:var(--bs-body-color)}.number-input{border:1px solid gray}.gsu-disabled-button{cursor:not-allowed;background-color:var(--gsu-color-background);opacity:.5}.gsu-menu-item{border-width:2px;border-color:var(--gsu-color-border);background-color:var(--gsu-color-background);color:var(--gsu-color-text)}.gsu-menu-item:hover{cursor:pointer;background-color:var(--gsu-color-highlight)}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-44{left:11rem}.top-0{top:0}.z-40{z-index:40}.z-50{z-index:50}.col-span-1{grid-column:span 1 / span 1}.col-span-10{grid-column:span 10 / span 10}.col-span-12{grid-column:span 12 / span 12}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-6{grid-column:span 6 / span 6}.col-span-7{grid-column:span 7 / span 7}.col-start-1{grid-column-start:1}.col-start-12{grid-column-start:12}.col-start-7{grid-column-start:7}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.-ml-6{margin-left:-1.5rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.mr-5{margin-right:1.25rem}.mr-auto{margin-right:auto}.mt-1{margin-top:.25rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.w-1\/5{width:20%}.w-2\/3{width:66.666667%}.w-56{width:14rem}.w-full{width:100%}.min-w-0{min-width:0}.min-w-32{min-width:8rem}.max-w-5xl{max-width:64rem}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-grow,.grow{flex-grow:1}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.gap-4{gap:1rem}.justify-self-end{justify-self:end}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-sm{border-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-width:1px}.border-2{border-width:2px}.border-solid{border-style:solid}.border-bgMutedColor{border-color:var(--gsu-background-muted)}.border-borderColor{border-color:var(--gsu-color-border)}.bg-backgroundColor{background-color:var(--gsu-color-background)}.bg-bgMutedColor{background-color:var(--gsu-background-muted)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity))}.bg-highlightedColor{background-color:var(--gsu-color-highlight)}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pl-12{padding-left:3rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-1{padding-right:.25rem}.pr-4{padding-right:1rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-normal{font-weight:400}.font-semibold{font-weight:600}.leading-normal{line-height:1.5}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity))}.text-textColor{color:var(--gsu-color-text)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.no-underline{text-decoration-line:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:root{--gsu-color-primary: #90CAF9;--gsu-color-secondary: #9FA8DA;--gsu-color-link: #2c7596;--gsu-color-text: #FFFFFF;--gsu-color-muted-text: #B0BEC5;--gsu-color-background: rgb(39, 39, 39);--gsu-color-border: rgba(255,255,255,.3);--gsu-background-muted: #212121;--gsu-color-highlight: #717171bb;--gsu-color-selected: #A5D6A7}.hover\:bg-bgMutedColor:hover{background-color:var(--gsu-background-muted)}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}@media (min-width: 640px){.sm\:flex{display:flex}}@media (prefers-color-scheme: dark){.dark\:bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.dark\:text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}}