@hkdigital/lib-sveltekit 0.0.95 → 0.0.97

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 (69) hide show
  1. package/dist/components/buttons/index.d.ts +1 -0
  2. package/dist/components/buttons/index.js +1 -0
  3. package/dist/components/buttons/plain-button/PlainButton.svelte +37 -0
  4. package/dist/components/buttons/plain-button/PlainButton.svelte.d.ts +10 -0
  5. package/dist/components/inputs/index.d.ts +1 -0
  6. package/dist/components/inputs/index.js +1 -0
  7. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -0
  8. package/dist/components/inputs/text-input/TextInput.svelte +226 -0
  9. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +26 -0
  10. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -0
  11. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -0
  12. package/dist/components/inputs/text-input/assets/IconInvalid.svelte.d.ts +26 -0
  13. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -0
  14. package/dist/components/inputs/text-input/assets/IconValid.svelte.d.ts +26 -0
  15. package/dist/components/panels/index.d.ts +1 -0
  16. package/dist/components/panels/index.js +1 -0
  17. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -0
  18. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +10 -0
  19. package/dist/components/rows/index.d.ts +2 -0
  20. package/dist/components/rows/index.js +3 -0
  21. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -0
  22. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +12 -0
  23. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -0
  24. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +12 -0
  25. package/dist/components/widgets/scale-control/ScaleControl.svelte +0 -0
  26. package/dist/components/widgets/scale-control/ScaleControl.svelte.d.ts +26 -0
  27. package/dist/components/widgets/scale-control/index.d.ts +1 -0
  28. package/dist/components/widgets/scale-control/index.js +1 -0
  29. package/dist/config/tailwind.extend.d.ts +8 -8
  30. package/dist/config/tailwind.extend.js +51 -55
  31. package/dist/constants/css-states/index.d.ts +1 -0
  32. package/dist/constants/css-states/index.js +1 -0
  33. package/dist/constants/css-states/input-states.d.ts +8 -0
  34. package/dist/constants/css-states/input-states.js +11 -0
  35. package/dist/constants/index.js +1 -0
  36. package/dist/index.d.ts +0 -1
  37. package/dist/index.js +0 -6
  38. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -0
  39. package/dist/themes/hkdev/components/buttons/plain-button.postcss +73 -0
  40. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -0
  41. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -0
  42. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -0
  43. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -0
  44. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -0
  45. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -0
  46. package/dist/themes/hkdev/components.postcss +49 -0
  47. package/dist/themes/hkdev/debug.postcss +2 -0
  48. package/dist/themes/hkdev/global/layout.postcss +39 -0
  49. package/dist/themes/hkdev/global/on-colors.postcss +53 -0
  50. package/dist/themes/hkdev/global/text.postcss__ +35 -0
  51. package/dist/themes/hkdev/global/vars.postcss__ +7 -0
  52. package/dist/themes/hkdev/globals.postcss +12 -0
  53. package/dist/themes/hkdev/responsive.postcss +12 -0
  54. package/dist/themes/hkdev/theme-ext.d.ts +4 -0
  55. package/dist/themes/hkdev/theme-ext.js +15 -0
  56. package/dist/themes/hkdev/theme.d.ts +226 -0
  57. package/dist/themes/hkdev/theme.js +227 -0
  58. package/dist/themes/index.d.ts +1 -0
  59. package/dist/themes/index.js +1 -0
  60. package/dist/util/sveltekit/index.d.ts +1 -0
  61. package/dist/util/sveltekit/index.js +1 -0
  62. package/dist/util/sveltekit/route-folders/index.d.ts +23 -0
  63. package/dist/util/sveltekit/route-folders/index.js +82 -0
  64. package/package.json +3 -1
  65. package/dist/components/input/HkInputField.svelte +0 -50
  66. package/dist/components/input/HkInputField.svelte.d.ts +0 -14
  67. package/dist/components/input/index.d.ts +0 -1
  68. package/dist/components/input/index.js +0 -1
  69. /package/dist/css/{tw-prose.postcss → tw-prose.postcss__} +0 -0
@@ -0,0 +1,104 @@
1
+ <script>
2
+ /**
3
+ * @example
4
+ *
5
+ */
6
+
7
+ /**
8
+ * @type {{
9
+ * base?: string,
10
+ * bg?: string,
11
+ * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
12
+ * justifyItems?: 'start'|'center'|'end'|'stretch',
13
+ * gap?: string,
14
+ * classes?: string,
15
+ * children?: import('svelte').Snippet,
16
+ * } & { [attr: string]: * }}
17
+ */
18
+ const {
19
+ // Style
20
+ base,
21
+ bg,
22
+ justify,
23
+ justifyItems,
24
+ flow = 'col',
25
+ gap,
26
+ classes,
27
+
28
+ // Snippets
29
+ children,
30
+
31
+ // Attributes
32
+ ...attrs
33
+ } = $props();
34
+
35
+ let colsCls = $derived.by(() => {
36
+ //
37
+ // The CSS classes to apply for the desired column layout
38
+ //
39
+ let out = '';
40
+
41
+ /* @note justify-end won't work with auto-cols-fr! */
42
+
43
+ if (justifyItems && justify !== 'end') {
44
+ out += 'auto-cols-fr';
45
+ } else {
46
+ out += 'auto-cols-auto';
47
+ }
48
+
49
+ if (flow) {
50
+ out += ` grid-flow-${flow}`;
51
+ }
52
+
53
+ // TODO: CSS for a specific number of columns
54
+
55
+ return out.replace(/\s{2,}/g, ' ').trim();
56
+ });
57
+
58
+ let justifyCls = $derived.by(() => {
59
+ //
60
+ // Determine justify classes
61
+ //
62
+ if (justify) {
63
+ return `justify-${justify}`;
64
+ }
65
+
66
+ return '';
67
+ });
68
+
69
+ let justifyItemsCls = $derived.by(() => {
70
+ //
71
+ // Determine justify-items classes
72
+ //
73
+ if (justifyItems) {
74
+ return `justify-items-${justifyItems}`;
75
+ }
76
+
77
+ return '';
78
+ });
79
+ </script>
80
+
81
+ <div
82
+ data-row="panel-grid-row"
83
+ class="{base} {bg} {gap} {classes} grid {colsCls} {justifyCls} {justifyItemsCls}"
84
+ {...attrs}
85
+ >
86
+ {@render children()}
87
+ </div>
88
+
89
+ <style>
90
+ /* This rule makes justify-items-start behave like
91
+ justify-items-center and justify-items-end */
92
+ /*[data-row='panel-grid-row'] {
93
+ & > :global(*) {
94
+ width: fit-content;
95
+ height: fit-content;
96
+ }
97
+ }*/
98
+
99
+ /*[data-row='panel-grid-row'] {
100
+ & > :global(*) {
101
+ min-width: 0;
102
+ }
103
+ }*/
104
+ </style>
@@ -0,0 +1,12 @@
1
+ export default PanelGridRow;
2
+ declare const PanelGridRow: import("svelte").Component<{
3
+ base?: string;
4
+ bg?: string;
5
+ justify?: "start" | "center" | "end" | "between" | "around" | "evenly" | "stretch" | "normal";
6
+ justifyItems?: "start" | "center" | "end" | "stretch";
7
+ gap?: string;
8
+ classes?: string;
9
+ children?: import("svelte").Snippet;
10
+ } & {
11
+ [attr: string]: any;
12
+ }, {}, "">;
@@ -0,0 +1,40 @@
1
+ <script>
2
+ import { PanelGridRow } from '../index.js';
3
+
4
+ /**
5
+ * @example
6
+ */
7
+
8
+ /**
9
+ * @type {{
10
+ * base?: string,
11
+ * bg?: string,
12
+ * justify?: 'start'|'center'|'end'|'between'|'around'|'evenly'|'stretch'|'normal',
13
+ * justifyItems?: 'start'|'center'|'end'|'stretch',
14
+ * gap?: string,
15
+ * classes?: string,
16
+ * children?: import('svelte').Snippet,
17
+ * } & { [attr: string]: * }}
18
+ */
19
+ const {
20
+ // Style
21
+ // base,
22
+ // bg,
23
+ // justify,
24
+ // justifyItems,
25
+ // flow = 'col',
26
+ // gap,
27
+ // classes,
28
+
29
+ // // Snippets
30
+ // children,
31
+
32
+ // Attributes
33
+ ...attrs
34
+ } = $props();
35
+ </script>
36
+
37
+ <!-- class="test-small mb-8p mt-8 grid auto-cols-fr grid-flow-col justify-stretch gap-20p" -->
38
+
39
+ <PanelGridRow data-wrapper="panel-row-2" gap="gap-20p" {...attrs}
40
+ ></PanelGridRow>
@@ -0,0 +1,12 @@
1
+ export default PanelRow2;
2
+ declare const PanelRow2: import("svelte").Component<{
3
+ base?: string;
4
+ bg?: string;
5
+ justify?: "start" | "center" | "end" | "between" | "around" | "evenly" | "stretch" | "normal";
6
+ justifyItems?: "start" | "center" | "end" | "stretch";
7
+ gap?: string;
8
+ classes?: string;
9
+ children?: import("svelte").Snippet;
10
+ } & {
11
+ [attr: string]: any;
12
+ }, {}, "">;
@@ -0,0 +1,26 @@
1
+ export default ScaleControl;
2
+ type ScaleControl = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string;
8
+ };
9
+ declare const ScaleControl: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1 @@
1
+ export { default as ScaleControl } from "./ScaleControl.svelte";
@@ -0,0 +1 @@
1
+ export { default as ScaleControl } from './ScaleControl.svelte';
@@ -11,6 +11,8 @@ export const spacing: {
11
11
  '120p': string;
12
12
  '160p': string;
13
13
  '180p': string;
14
+ '1p': string;
15
+ '2p': string;
14
16
  '4p': string;
15
17
  '6p': string;
16
18
  '8p': string;
@@ -18,7 +20,10 @@ export const spacing: {
18
20
  '24p': string;
19
21
  };
20
22
  export const fontSize: {
23
+ '12p': string;
24
+ '14p': string;
21
25
  '16p': string;
26
+ '18p': string;
22
27
  '20p': string;
23
28
  '24p': string;
24
29
  '32p': string;
@@ -27,23 +32,18 @@ export const fontSize: {
27
32
  base: string;
28
33
  lg: string;
29
34
  xl: string;
30
- '2xl': string;
31
- '3xl': string;
32
- '4xl': string;
33
- '5xl': string;
34
- '6xl': string;
35
- '7xl': string;
36
- '8xl': string;
37
- '9xl': string;
38
35
  };
39
36
  export namespace borderRadius {
40
37
  let none: number;
38
+ let xs: string;
41
39
  let sm: string;
42
40
  let md: string;
43
41
  let lg: string;
42
+ let xl: string;
44
43
  let full: string;
45
44
  }
46
45
  export const borderWidth: {
47
46
  '1p': string;
48
47
  '2p': string;
48
+ '4p': string;
49
49
  };
@@ -1,60 +1,56 @@
1
+ export const spacing = {
2
+ // Between elements spacing
3
+ '5p': '0.3125rem',
4
+ '10p': '0.625rem',
5
+ '20p': '1.25rem',
6
+ '30p': '1.875rem',
7
+ '40p': '2.5rem',
8
+ '50p': '3.125rem',
9
+ '60p': '3.75rem',
10
+ '80p': '5rem',
11
+ '100p': '6.25rem',
12
+ '120p': '7.5rem',
13
+ '160p': '10rem',
14
+ '180p': '11.25rem',
1
15
 
2
- export const spacing =
3
- {
4
- '5p': '0.3125rem',
5
- '10p': '0.625rem',
6
- '20p': '1.25rem',
7
- '30p': '1.875rem',
8
- '40p': '2.5rem',
9
- '50p': '3.125rem',
10
- '60p': '3.75rem',
11
- '80p': '5rem',
12
- '100p': '6.25rem',
13
- '120p': '7.5rem',
14
- '160p': '10rem',
15
- '180p': '11.25rem',
16
+ // Text related spacing
17
+ '1p': '0.0625rem',
18
+ '2p': '0.125rem',
19
+ '4p': '0.25rem',
20
+ '6p': '0.375rem',
21
+ '8p': '0.5rem',
22
+ '16p': '1rem',
23
+ '24p': '1.5rem'
24
+ };
16
25
 
17
- '4p': '0.25rem',
18
- '6p': '0.375rem',
19
- '8p': '0.5rem',
20
- '16p': '1rem',
21
- '24p': '1.5rem'
22
- };
26
+ export const fontSize = {
27
+ '12p': '0.75rem',
28
+ '14p': '0.875rem',
29
+ '16p': '1rem',
30
+ '18p': '1.125rem',
31
+ '20p': '1.25rem',
32
+ '24p': '1.5rem',
33
+ '32p': '2rem',
34
+ '50p': '3.125rem',
23
35
 
36
+ sm: '0.875rem',
37
+ base: '1rem',
38
+ lg: '1.125rem',
39
+ xl: '1.25rem'
40
+ };
24
41
 
25
- export const fontSize =
26
- {
27
- '16p': '1rem',
28
- '20p': '1.25rem',
29
- '24p': '1.5rem',
30
- '32p': '2rem',
31
- '50p': '3.125rem',
42
+ export const borderRadius = {
43
+ none: 0,
44
+ xs: '0.250rem',
45
+ sm: '0.875rem',
46
+ md: '1.25rem',
47
+ lg: '2rem',
48
+ xl: '3.125rem',
49
+ full: '9999px'
50
+ };
32
51
 
33
- 'sm': '87.5%',
34
- 'base': '100%', // 16
35
- 'lg': '112.5%', // 18
36
- 'xl': '125%', // 20
37
- '2xl': '150%', // 24
38
- '3xl': '187.5%', // 30
39
- '4xl': '250%', // 40
40
- '5xl': '312.5%', // 50
41
- '6xl': '375%', // 60
42
- '7xl': '450%', // 72
43
- '8xl': '600%', // 96
44
- '9xl': '800%x' // 128
45
- };
46
-
47
- export const borderRadius =
48
- {
49
- none: 0,
50
- sm: '0.875rem',
51
- md: '1.25rem',
52
- lg: '2.5rem',
53
- full: '9999px'
54
- };
55
-
56
- export const borderWidth =
57
- {
58
- '1p': '0.0625rem',
59
- '2p': '0.125rem'
60
- };
52
+ export const borderWidth = {
53
+ '1p': '0.0625rem',
54
+ '2p': '0.125rem',
55
+ '4p': '0.250rem'
56
+ };
@@ -0,0 +1 @@
1
+ export * from "./input-states.js";
@@ -0,0 +1 @@
1
+ export * from './input-states.js';
@@ -0,0 +1,8 @@
1
+ export const PRISTINE: "pristine";
2
+ export const DIRTY: "dirty";
3
+ export const FOCUSED: "focused";
4
+ export const UNFOCUSED: "unfocused";
5
+ export const VALID: "valid";
6
+ export const INVALID: "invalid";
7
+ export const REQUIRED: "required";
8
+ export const DISABLED: "disabled";
@@ -0,0 +1,11 @@
1
+ export const PRISTINE = 'pristine';
2
+ export const DIRTY = 'dirty';
3
+
4
+ export const FOCUSED = 'focused';
5
+ export const UNFOCUSED = 'unfocused';
6
+
7
+ export const VALID = 'valid';
8
+ export const INVALID = 'invalid';
9
+
10
+ export const REQUIRED = 'required';
11
+ export const DISABLED = 'disabled';
@@ -1,2 +1,3 @@
1
1
  export * as regexp from './regexp/index.js';
2
2
  export * as time from './time.js';
3
+ //export * as cssStates from './css-states/index.js';
package/dist/index.d.ts CHANGED
@@ -1 +0,0 @@
1
- declare const jens: 12345;
package/dist/index.js CHANGED
@@ -1,6 +0,0 @@
1
- // // @note all exports are in subfolders // // @see package.json > exports //
2
- // @example // import {TimeStampSource} from '@hkdigital/lib-sveltekit/classes';
3
-
4
- const jens = 12345;
5
-
6
- console.log(jens);
@@ -0,0 +1,13 @@
1
+ @import "../../global/on-colors.postcss";
2
+
3
+ @define-mixin boxes-game-box {
4
+
5
+ [data-boxes="game-box"] {
6
+ /*& .game-box-padding-20p {
7
+ @apply mt-20p;
8
+ @apply mr-20p;
9
+ @apply mb-20p;
10
+ @apply ml-20p;
11
+ }*/
12
+ }
13
+ }
@@ -0,0 +1,73 @@
1
+
2
+ @import "../../global/on-colors.postcss";
3
+
4
+ @define-mixin buttons-plain-button {
5
+
6
+ [data-button="plain-button"] {
7
+ @apply py-6p rounded-sm;
8
+
9
+ & p {
10
+ @apply text-20p base-font-family font-black my-0 mx-16p uppercase;
11
+ }
12
+
13
+ /* not disabled */
14
+
15
+ &:not([disabled]) {
16
+ &.role-primary {
17
+ @apply border-4p border-primary-500 bg-primary-500;
18
+ & .p {
19
+ color: rgb(var(--color-primary-50));
20
+ }
21
+ }
22
+
23
+ &.role-secondary {
24
+ @apply border-4p border-primary-500;
25
+
26
+ & .p {
27
+ color: rgb(var(--color-primary-500));
28
+ }
29
+
30
+ &.variant-white
31
+ {
32
+ @apply border-surface-50;
33
+
34
+ & .p {
35
+ color: rgb(var(--color-surface-50));
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ /* disabled */
42
+
43
+ &[disabled] {
44
+ &.role-primary {
45
+ @apply bg-surface-500;
46
+ & .p {
47
+ color: rgb(var(--color-surface-300));
48
+ }
49
+ }
50
+
51
+ &.role-secondary {
52
+ @apply border-4p bg-primary-50;
53
+
54
+ & .p {
55
+ color: rgb(var(--color-surface-300));
56
+ }
57
+ }
58
+
59
+ }
60
+ }
61
+
62
+
63
+
64
+ /*[data-button-round-arrow-next] {
65
+ / * @apply bg-primary-500; * /
66
+ @apply text-24p base-font-family font-bold;
67
+
68
+ & svg {
69
+ color: rgb(var(--color-primary-500));
70
+ @apply w-80p h-80p;
71
+ }
72
+ }*/
73
+ }
@@ -0,0 +1,8 @@
1
+ @import "../../global/on-colors.postcss";
2
+
3
+ @define-mixin buttons-skip-button {
4
+
5
+ [data-button="skip-button"] {
6
+
7
+ }
8
+ }
@@ -0,0 +1,108 @@
1
+
2
+ /*@import "../../global/on-colors.postcss";*/
3
+
4
+ @define-mixin inputs-text-input {
5
+
6
+ [data-input="text-input"] {
7
+
8
+ /* Base */
9
+
10
+
11
+
12
+ /* Required and disabled */
13
+
14
+ &.required {}
15
+ &.disabled {}
16
+
17
+ /* Focus */
18
+
19
+ &.focused {
20
+ border: solid thin black;
21
+
22
+ & [data-child="legend"] {
23
+ color: black;
24
+ }
25
+
26
+ & [data-child="input"] {
27
+ color: black;
28
+ }
29
+ }
30
+
31
+ &.unfocused {
32
+ border: solid thin grey;
33
+
34
+ & [data-child="legend"] {
35
+ color: grey;
36
+ }
37
+
38
+ & [data-child="input"] {
39
+ color: grey;
40
+ }
41
+ }
42
+
43
+ /* Invalid */
44
+ &.invalid {
45
+ &.pristine [data-child="legend"] {
46
+ color: white;
47
+ background-color: orange;
48
+ }
49
+
50
+ &.dirty {
51
+ &.focused [data-child="legend"] {
52
+ color: black;
53
+ background-color: yellow;
54
+ }
55
+
56
+ &.unfocused [data-child="legend"] {
57
+ color: white;
58
+ background-color: red;
59
+ }
60
+ }
61
+ }
62
+
63
+ /* Pristine (valid-invalid) */
64
+
65
+ &.pristine.valid {
66
+ & [data-child="icon-box"] {
67
+ color: grey;
68
+ }
69
+ }
70
+
71
+ &.pristine.invalid {
72
+ & [data-child="icon-box"] {
73
+ color: orange;
74
+ }
75
+ }
76
+
77
+ /* Dirty (valid-invalid) */
78
+
79
+ &.dirty.valid {
80
+ &.focused {
81
+ & [data-child="icon-box"] {
82
+ color: grey;
83
+ }
84
+ }
85
+
86
+ &.unfocused {
87
+ & [data-child="icon-box"] {
88
+ color: green;
89
+ }
90
+ }
91
+ }
92
+
93
+ &.dirty.invalid {
94
+ &.focused {
95
+ & [data-child="icon-box"] {
96
+ color: orange;
97
+ }
98
+ }
99
+
100
+ &.unfocused {
101
+ & [data-child="icon-box"] {
102
+ color: red;
103
+ }
104
+ }
105
+ }
106
+
107
+ }
108
+ }
@@ -0,0 +1,46 @@
1
+ /*@import "../../global/on-colors.postcss";*/
2
+
3
+ @define-mixin panels-plain-panel {
4
+ [data-panel="plain-panel"] {
5
+
6
+ @mixin on_surface_light;
7
+ @apply bg-primary-50;
8
+
9
+ @apply p-40p rounded-md;
10
+
11
+ max-width: 50vw;
12
+ /* max-width: 27vw;*/
13
+ /* width: 26vw; */
14
+
15
+ & picture {
16
+ display: block;
17
+ max-width: 100%;
18
+ @apply pr-80p;
19
+ /* border: solid 1px red; */
20
+ }
21
+
22
+ & > .h1 {
23
+ @apply text-32p mb-20p;
24
+ }
25
+
26
+ & > .p {
27
+ @apply text-24p mb-10p;
28
+
29
+ & + picture {
30
+ @apply mt-40p;
31
+ }
32
+
33
+ }
34
+
35
+ & button {
36
+ /* @apply min-w-180p; */
37
+ }
38
+
39
+ & .cc_cols-stretch {
40
+ @apply grid auto-cols-fr grid-flow-col;
41
+ @apply justify-stretch;
42
+
43
+ border: solid 8px red;
44
+ }
45
+ }
46
+ }