@innosolutions/inno-calendar 1.0.72 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/LICENSE +48 -48
  3. package/README.md +333 -305
  4. package/dist/components/event/event-card.d.ts +3 -27
  5. package/dist/components/event/event-card.d.ts.map +1 -1
  6. package/dist/components/header/calendar-header.d.ts +14 -3
  7. package/dist/components/header/calendar-header.d.ts.map +1 -1
  8. package/dist/components/index.cjs +1 -1
  9. package/dist/components/index.d.ts +7 -6
  10. package/dist/components/index.d.ts.map +1 -1
  11. package/dist/components/index.mjs +48 -57
  12. package/dist/components/index.mjs.map +1 -1
  13. package/dist/components/inno-calendar.d.ts +139 -72
  14. package/dist/components/inno-calendar.d.ts.map +1 -1
  15. package/dist/components/primitives/field-layer.d.ts +12 -0
  16. package/dist/components/primitives/field-layer.d.ts.map +1 -0
  17. package/dist/components/primitives/index.d.ts +3 -0
  18. package/dist/components/primitives/index.d.ts.map +1 -1
  19. package/dist/components/primitives/quick-create.d.ts +44 -0
  20. package/dist/components/primitives/quick-create.d.ts.map +1 -0
  21. package/dist/components/primitives/recurrence-field.d.ts +102 -0
  22. package/dist/components/primitives/recurrence-field.d.ts.map +1 -0
  23. package/dist/components/primitives/when-row.d.ts +41 -0
  24. package/dist/components/primitives/when-row.d.ts.map +1 -0
  25. package/dist/components/shell/calendar-settings.d.ts +28 -0
  26. package/dist/components/shell/calendar-settings.d.ts.map +1 -0
  27. package/dist/components/shell/calendar-sidebar.d.ts +27 -0
  28. package/dist/components/shell/calendar-sidebar.d.ts.map +1 -0
  29. package/dist/components/shell/filter-panel.d.ts +10 -0
  30. package/dist/components/shell/filter-panel.d.ts.map +1 -0
  31. package/dist/components/shell/index.d.ts +5 -0
  32. package/dist/components/shell/index.d.ts.map +1 -0
  33. package/dist/components/shell/mini-month.d.ts +16 -0
  34. package/dist/components/shell/mini-month.d.ts.map +1 -0
  35. package/dist/components/ui/index.d.ts +0 -2
  36. package/dist/components/ui/index.d.ts.map +1 -1
  37. package/dist/components/views/agenda-view.d.ts +14 -15
  38. package/dist/components/views/agenda-view.d.ts.map +1 -1
  39. package/dist/components/views/day-events-expansion.d.ts +1 -1
  40. package/dist/components/views/day-events-expansion.d.ts.map +1 -1
  41. package/dist/components/views/day-view.d.ts +2 -6
  42. package/dist/components/views/day-view.d.ts.map +1 -1
  43. package/dist/components/views/index.d.ts +2 -1
  44. package/dist/components/views/index.d.ts.map +1 -1
  45. package/dist/components/views/month-view.d.ts +2 -12
  46. package/dist/components/views/month-view.d.ts.map +1 -1
  47. package/dist/components/views/resource-columns-view.d.ts +23 -0
  48. package/dist/components/views/resource-columns-view.d.ts.map +1 -0
  49. package/dist/components/views/timeline-view.d.ts +2 -6
  50. package/dist/components/views/timeline-view.d.ts.map +1 -1
  51. package/dist/components/views/week-view.d.ts +10 -6
  52. package/dist/components/views/week-view.d.ts.map +1 -1
  53. package/dist/components/views/year-view.d.ts +2 -6
  54. package/dist/components/views/year-view.d.ts.map +1 -1
  55. package/dist/core/constants.d.ts +32 -1
  56. package/dist/core/constants.d.ts.map +1 -1
  57. package/dist/core/context/drag-drop-context.d.ts +15 -1
  58. package/dist/core/context/drag-drop-context.d.ts.map +1 -1
  59. package/dist/core/context/event-card-context.d.ts +16 -0
  60. package/dist/core/context/event-card-context.d.ts.map +1 -0
  61. package/dist/core/context/inno-calendar-provider.d.ts +10 -1
  62. package/dist/core/context/inno-calendar-provider.d.ts.map +1 -1
  63. package/dist/core/context/slot-selection-context.d.ts +16 -0
  64. package/dist/core/context/slot-selection-context.d.ts.map +1 -1
  65. package/dist/core/index.cjs +1 -1
  66. package/dist/core/index.d.ts +3 -1
  67. package/dist/core/index.d.ts.map +1 -1
  68. package/dist/core/index.mjs +160 -155
  69. package/dist/core/index.mjs.map +1 -1
  70. package/dist/core/types.d.ts +44 -514
  71. package/dist/core/types.d.ts.map +1 -1
  72. package/dist/core/utils/date-input.d.ts +8 -0
  73. package/dist/core/utils/date-input.d.ts.map +1 -0
  74. package/dist/core/utils/grid-utils.d.ts.map +1 -1
  75. package/dist/core/utils/index.d.ts +1 -0
  76. package/dist/core/utils/index.d.ts.map +1 -1
  77. package/dist/core/utils/time-format.d.ts +24 -0
  78. package/dist/core/utils/time-format.d.ts.map +1 -0
  79. package/dist/core/utils/view-storage.d.ts +2 -2
  80. package/dist/core/utils/view-storage.d.ts.map +1 -1
  81. package/dist/core/z-layers.d.ts +21 -0
  82. package/dist/core/z-layers.d.ts.map +1 -0
  83. package/dist/index.cjs +1 -1
  84. package/dist/index.d.ts +0 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.mjs +227 -234
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/inno-calendar-B6qXIqxY.js +7433 -0
  89. package/dist/inno-calendar-B6qXIqxY.js.map +1 -0
  90. package/dist/inno-calendar-BnCt65PZ.cjs +11 -0
  91. package/dist/inno-calendar-BnCt65PZ.cjs.map +1 -0
  92. package/dist/lib/index.cjs +1 -1
  93. package/dist/lib/index.mjs +1 -1
  94. package/dist/position-utils-BzSoogFQ.cjs +2 -0
  95. package/dist/position-utils-BzSoogFQ.cjs.map +1 -0
  96. package/dist/position-utils-CBSmf90e.js +1106 -0
  97. package/dist/position-utils-CBSmf90e.js.map +1 -0
  98. package/dist/styles/index.css +1 -1
  99. package/dist/use-slot-selection-CxPvMluJ.cjs +2 -0
  100. package/dist/use-slot-selection-CxPvMluJ.cjs.map +1 -0
  101. package/dist/use-slot-selection-IXHnP8C1.js +357 -0
  102. package/dist/use-slot-selection-IXHnP8C1.js.map +1 -0
  103. package/dist/utils-B6yFEsav.js +9 -0
  104. package/dist/utils-B6yFEsav.js.map +1 -0
  105. package/dist/utils-IjLH3w2e.cjs +2 -0
  106. package/dist/utils-IjLH3w2e.cjs.map +1 -0
  107. package/dist/utils.cjs +1 -1
  108. package/dist/utils.d.ts +1 -1
  109. package/dist/utils.d.ts.map +1 -1
  110. package/dist/utils.mjs +99 -96
  111. package/dist/z-layers-Bavypndz.cjs +2 -0
  112. package/dist/z-layers-Bavypndz.cjs.map +1 -0
  113. package/dist/z-layers-r5PdtThu.js +637 -0
  114. package/dist/z-layers-r5PdtThu.js.map +1 -0
  115. package/package.json +117 -138
  116. package/AGENT.md +0 -1783
  117. package/dist/agenda-widget-B0t3TCcV.js +0 -4141
  118. package/dist/agenda-widget-B0t3TCcV.js.map +0 -1
  119. package/dist/agenda-widget-i2tjGr5U.cjs +0 -2
  120. package/dist/agenda-widget-i2tjGr5U.cjs.map +0 -1
  121. package/dist/components/calendar.d.ts +0 -45
  122. package/dist/components/calendar.d.ts.map +0 -1
  123. package/dist/components/event/event-page-transition.d.ts +0 -32
  124. package/dist/components/event/event-page-transition.d.ts.map +0 -1
  125. package/dist/components/filters/calendar-filter-sidebar.d.ts +0 -54
  126. package/dist/components/filters/calendar-filter-sidebar.d.ts.map +0 -1
  127. package/dist/components/filters/index.d.ts +0 -9
  128. package/dist/components/filters/index.d.ts.map +0 -1
  129. package/dist/components/filters/schedule-type-filter.d.ts +0 -31
  130. package/dist/components/filters/schedule-type-filter.d.ts.map +0 -1
  131. package/dist/components/filters/user-filter.d.ts +0 -31
  132. package/dist/components/filters/user-filter.d.ts.map +0 -1
  133. package/dist/components/header/components/index.d.ts +0 -8
  134. package/dist/components/header/components/index.d.ts.map +0 -1
  135. package/dist/components/integrated-calendar.d.ts +0 -37
  136. package/dist/components/integrated-calendar.d.ts.map +0 -1
  137. package/dist/components/settings/badge-variant-setting.d.ts +0 -25
  138. package/dist/components/settings/badge-variant-setting.d.ts.map +0 -1
  139. package/dist/components/settings/index.d.ts +0 -10
  140. package/dist/components/settings/index.d.ts.map +0 -1
  141. package/dist/components/settings/slot-duration-setting.d.ts +0 -20
  142. package/dist/components/settings/slot-duration-setting.d.ts.map +0 -1
  143. package/dist/components/settings/visible-hours-setting.d.ts +0 -23
  144. package/dist/components/settings/visible-hours-setting.d.ts.map +0 -1
  145. package/dist/components/settings/working-hours-setting.d.ts +0 -41
  146. package/dist/components/settings/working-hours-setting.d.ts.map +0 -1
  147. package/dist/components/ui/dialog.d.ts +0 -35
  148. package/dist/components/ui/dialog.d.ts.map +0 -1
  149. package/dist/components/ui/select.d.ts +0 -12
  150. package/dist/components/ui/select.d.ts.map +0 -1
  151. package/dist/components/widget/agenda-dropdown.d.ts +0 -20
  152. package/dist/components/widget/agenda-dropdown.d.ts.map +0 -1
  153. package/dist/components/widget/agenda-widget.d.ts +0 -27
  154. package/dist/components/widget/agenda-widget.d.ts.map +0 -1
  155. package/dist/components/widget/index.d.ts +0 -6
  156. package/dist/components/widget/index.d.ts.map +0 -1
  157. package/dist/index-D2U2F80P.cjs +0 -2
  158. package/dist/index-D2U2F80P.cjs.map +0 -1
  159. package/dist/index-DtaLkIY8.js +0 -2777
  160. package/dist/index-DtaLkIY8.js.map +0 -1
  161. package/dist/position-utils-D_KpwRus.js +0 -1053
  162. package/dist/position-utils-D_KpwRus.js.map +0 -1
  163. package/dist/position-utils-ksZ_IjXC.cjs +0 -2
  164. package/dist/position-utils-ksZ_IjXC.cjs.map +0 -1
  165. package/dist/presets/default/default-calendar.d.ts +0 -44
  166. package/dist/presets/default/default-calendar.d.ts.map +0 -1
  167. package/dist/presets/default/index.d.ts +0 -2
  168. package/dist/presets/default/index.d.ts.map +0 -1
  169. package/dist/presets/index.cjs +0 -2
  170. package/dist/presets/index.cjs.map +0 -1
  171. package/dist/presets/index.d.ts +0 -3
  172. package/dist/presets/index.d.ts.map +0 -1
  173. package/dist/presets/index.mjs +0 -6
  174. package/dist/presets/index.mjs.map +0 -1
  175. package/dist/presets/tailwind/index.d.ts +0 -2
  176. package/dist/presets/tailwind/index.d.ts.map +0 -1
  177. package/dist/presets/tailwind/tailwind-calendar.d.ts +0 -122
  178. package/dist/presets/tailwind/tailwind-calendar.d.ts.map +0 -1
  179. package/dist/slot-selection-context-CLYZU6ul.cjs +0 -2
  180. package/dist/slot-selection-context-CLYZU6ul.cjs.map +0 -1
  181. package/dist/slot-selection-context-Ct5cVcKW.js +0 -611
  182. package/dist/slot-selection-context-Ct5cVcKW.js.map +0 -1
  183. package/dist/tailwind-calendar-BbUb61uY.cjs +0 -2
  184. package/dist/tailwind-calendar-BbUb61uY.cjs.map +0 -1
  185. package/dist/tailwind-calendar-DrwGVSF-.js +0 -400
  186. package/dist/tailwind-calendar-DrwGVSF-.js.map +0 -1
  187. package/dist/use-calendar-BK0nQYJq.cjs +0 -2
  188. package/dist/use-calendar-BK0nQYJq.cjs.map +0 -1
  189. package/dist/use-calendar-DJI35SSd.js +0 -175
  190. package/dist/use-calendar-DJI35SSd.js.map +0 -1
  191. package/dist/use-slot-selection-CCE11R4j.cjs +0 -2
  192. package/dist/use-slot-selection-CCE11R4j.cjs.map +0 -1
  193. package/dist/use-slot-selection-CX1w8EdM.js +0 -188
  194. package/dist/use-slot-selection-CX1w8EdM.js.map +0 -1
  195. package/dist/week-view-BXmaRChB.cjs +0 -11
  196. package/dist/week-view-BXmaRChB.cjs.map +0 -1
  197. package/dist/week-view-BeasFcyR.js +0 -3520
  198. package/dist/week-view-BeasFcyR.js.map +0 -1
package/CHANGELOG.md ADDED
@@ -0,0 +1,93 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@innosolutions/inno-calendar`.
4
+
5
+ ## 2.0.0
6
+
7
+ A breaking release. The package keeps the parts that are the same in every
8
+ calendar — the grid, the header, the floating card, the detail popover, the
9
+ filter panel — and hands the parts that differ per application back to the
10
+ application, as components you pass in.
11
+
12
+ The three overlapping ways to customise v1 (`slots`, `classNames`, render
13
+ props) are down to one: render props.
14
+
15
+ ### Migrating
16
+
17
+ | v1 | v2 |
18
+ | --- | --- |
19
+ | `slots={{ eventCard: MyCard }}` | `eventCard={(event, { compact }) => <MyCard … />}` |
20
+ | `slots={{ dayCellHeader, dayCellFooter }}` | — no replacement; the month cell is the package's |
21
+ | `renderEventDetail={({ event, onClose }) => …}` | `eventDetail={(event, { close, edit }) => …}` |
22
+ | `eventValues={(event) => toDraft(event)}` | `eventForm` receives the event; read it yourself |
23
+ | `classNames={{ … }}` (40 keys) | — no replacement yet; see *Styling* below |
24
+ | `import { DefaultCalendar } from '…/presets'` | compose `InnoCalendar` directly |
25
+ | `@tanstack/react-query` as a peer | removed; the package never imported it |
26
+
27
+ ### Removed
28
+
29
+ - **`slots`** and every `I*SlotProps` type (20 of them). The four slots that
30
+ were actually rendered — `eventCard` in the timeline and resource views,
31
+ `dayCellHeader` and `dayCellFooter` in the month view — are gone; the two
32
+ event-card ones fall through to the built-in card, which is what they did
33
+ when unset.
34
+ - **`classNames`** and `ICalendarClassNames`, 40 keys deep. Nothing consumed
35
+ it, and it never covered enough to keep an app out of the generated class
36
+ chains anyway.
37
+ - **`eventValues`** — superseded by `eventForm`, which is handed the event.
38
+ - **`renderEventDetail`** — superseded by `eventDetail`.
39
+ - **`/presets` subpath** and the `DefaultCalendar` / `TailwindCalendar`
40
+ components behind it. 917 lines nothing imported.
41
+ - **`Dialog` and `Select`** from the UI barrel — zero importers; `Sheet` uses
42
+ the Radix dialog primitive directly.
43
+ - **`@tanstack/react-query` peer dependency.** It was declared but never
44
+ imported. Hosts no longer need a `QueryClientProvider` around the calendar.
45
+
46
+ `core/types.ts` lost 541 lines to those removals; the package is 26,845 →
47
+ 21,522 source lines.
48
+
49
+ ### Fixed
50
+
51
+ - **`lucide-react` and three Radix packages were imported but not declared.**
52
+ They sat in `devDependencies` while `src` imported them, so a consumer
53
+ without them already installed got missing modules at runtime. They are now
54
+ real `dependencies`, and the build externalises them so the host resolves one
55
+ copy rather than a duplicate bundled inside the library.
56
+ - **`peerDependenciesMeta` was inert** — every key named a package that was not
57
+ in `peerDependencies`, which is the only thing that block annotates.
58
+ - **The detail popover ran off the screen.** It was three separate
59
+ `PopoverContent`s at two different widths; only one capped its height. They
60
+ are one `DetailPopover` now, capped to
61
+ `--radix-popover-content-available-height`, and below 640px it is a bottom
62
+ sheet rather than a popover — flipping a 384px card inside a 360px viewport
63
+ only changes which half falls off.
64
+ - **A dialog opened from inside a card dismissed the card underneath it.**
65
+ Radix treats a portalled child as "outside"; the card now ignores focus and
66
+ pointer events that land inside one. The selector is exported as `PORTALLED`.
67
+ - **`openForm()` did not open on the same slot the Add button does.** With no
68
+ range it now delegates to the header's own "open on now", snapping to the
69
+ slot and anchoring beside the current-time line. `openForm({ event })` falls
70
+ back to the event's own times instead of to *now*.
71
+ - **The mobile filter sheet stayed open** when its Create button opened the
72
+ card behind it.
73
+
74
+ ### Added
75
+
76
+ - `eventCard`, `eventDetail`, `eventForm` and `filters` render props — the one
77
+ extension mechanism.
78
+ - `QuickCreate`, `WhenRow`, `RecurrenceField` and `FieldLayer` as exported
79
+ primitives, so an app can build a form body that behaves like the built-in
80
+ one.
81
+ - `IC_Z_CARD`, `IC_Z_LAYER`, `IC_Z_MODAL` — stacking levels for anything a
82
+ consumer portals over a calendar surface.
83
+ - `CONTROL` and `CONTROL_ICON` — the shape every header control takes, shared
84
+ so Create, Today and the view menu cannot drift apart again.
85
+ - `COMPACT_WIDTH` — the single width at which floating surfaces stop floating.
86
+
87
+ ### Styling
88
+
89
+ The CSS custom properties (`--inno-primary`, `--inno-hour-height`, the ten
90
+ event colours, …) cover theme and dimensions and are unchanged. What `classNames`
91
+ offered beyond them — a hook on 40 individual elements — has no replacement.
92
+ Anything that specific is CSS against the package's own class names for now,
93
+ which is not yet a contract.
package/LICENSE CHANGED
@@ -1,48 +1,48 @@
1
- InnoSolutions Proprietary License
2
-
3
- Copyright (c) 2026 InnoSolutions. All rights reserved.
4
-
5
- This software, including its source code, compiled artifacts, and associated
6
- documentation files (collectively, the "Software"), is the confidential and
7
- proprietary property of InnoSolutions. The Software is licensed, not sold.
8
-
9
- 1. GRANT OF INTERNAL USE.
10
- InnoSolutions and its employees, contractors, and other authorized team
11
- members (collectively, "InnoSolutions Personnel") may use, copy, modify,
12
- build upon, and incorporate the Software, in whole or in part, solely for
13
- the purpose of developing and operating products, applications, and
14
- services that are owned, controlled, or operated by InnoSolutions
15
- ("InnoSolutions Projects").
16
-
17
- 2. RESTRICTIONS.
18
- Except as expressly permitted in Section 1, no person or entity may use,
19
- copy, reproduce, modify, adapt, merge, publish, distribute, sublicense,
20
- sell, lease, transmit, or create derivative works of the Software, in whole
21
- or in part, by any means, without a prior written agreement executed with
22
- InnoSolutions and on the terms that InnoSolutions requires. Any use outside
23
- an InnoSolutions Project, by anyone other than InnoSolutions Personnel,
24
- requires such a separate written agreement.
25
-
26
- 3. OWNERSHIP.
27
- All right, title, and interest in and to the Software, including all
28
- intellectual property rights, remain exclusively with InnoSolutions. No
29
- ownership rights are transferred by this license.
30
-
31
- 4. CONFIDENTIALITY.
32
- The Software is confidential. Recipients must not disclose the Software to
33
- any third party except as expressly authorized in writing by InnoSolutions.
34
-
35
- 5. TERMINATION.
36
- Any use, reproduction, or distribution of the Software in violation of this
37
- license automatically terminates the rights granted herein.
38
-
39
- 6. DISCLAIMER OF WARRANTY.
40
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42
- FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL
43
- INNOSOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
44
- IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN
45
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46
-
47
- For licensing inquiries or to request an agreement to use the Software outside
48
- the terms above, contact InnoSolutions.
1
+ InnoSolutions Proprietary License
2
+
3
+ Copyright (c) 2026 InnoSolutions. All rights reserved.
4
+
5
+ This software, including its source code, compiled artifacts, and associated
6
+ documentation files (collectively, the "Software"), is the confidential and
7
+ proprietary property of InnoSolutions. The Software is licensed, not sold.
8
+
9
+ 1. GRANT OF INTERNAL USE.
10
+ InnoSolutions and its employees, contractors, and other authorized team
11
+ members (collectively, "InnoSolutions Personnel") may use, copy, modify,
12
+ build upon, and incorporate the Software, in whole or in part, solely for
13
+ the purpose of developing and operating products, applications, and
14
+ services that are owned, controlled, or operated by InnoSolutions
15
+ ("InnoSolutions Projects").
16
+
17
+ 2. RESTRICTIONS.
18
+ Except as expressly permitted in Section 1, no person or entity may use,
19
+ copy, reproduce, modify, adapt, merge, publish, distribute, sublicense,
20
+ sell, lease, transmit, or create derivative works of the Software, in whole
21
+ or in part, by any means, without a prior written agreement executed with
22
+ InnoSolutions and on the terms that InnoSolutions requires. Any use outside
23
+ an InnoSolutions Project, by anyone other than InnoSolutions Personnel,
24
+ requires such a separate written agreement.
25
+
26
+ 3. OWNERSHIP.
27
+ All right, title, and interest in and to the Software, including all
28
+ intellectual property rights, remain exclusively with InnoSolutions. No
29
+ ownership rights are transferred by this license.
30
+
31
+ 4. CONFIDENTIALITY.
32
+ The Software is confidential. Recipients must not disclose the Software to
33
+ any third party except as expressly authorized in writing by InnoSolutions.
34
+
35
+ 5. TERMINATION.
36
+ Any use, reproduction, or distribution of the Software in violation of this
37
+ license automatically terminates the rights granted herein.
38
+
39
+ 6. DISCLAIMER OF WARRANTY.
40
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
41
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
42
+ FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL
43
+ INNOSOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER
44
+ IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN
45
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46
+
47
+ For licensing inquiries or to request an agreement to use the Software outside
48
+ the terms above, contact InnoSolutions.