titaned-frontend-library 1.0.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.
Files changed (77) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/MEILISEARCH_INTEGRATION.md +261 -0
  3. package/README.md +236 -0
  4. package/SEARCH_INTEGRATION_README.md +208 -0
  5. package/dist/App.d.ts +3 -0
  6. package/dist/components/ButtonComponent.scss +3 -0
  7. package/dist/components/Footer.scss +87 -0
  8. package/dist/components/MainHeader.scss +915 -0
  9. package/dist/components/Sidebar.scss +170 -0
  10. package/dist/components/UserMenu.scss +0 -0
  11. package/dist/components/common/Button/ButtonComponent.d.ts +4 -0
  12. package/dist/components/common/Footer/Footer.d.ts +4 -0
  13. package/dist/components/common/Header/MainHeader.d.ts +4 -0
  14. package/dist/components/common/Header/SimpleSearchContext.d.ts +36 -0
  15. package/dist/components/common/NavDropdownMenu/NavDropdownMenu.d.ts +11 -0
  16. package/dist/components/common/SearchHighlight.d.ts +11 -0
  17. package/dist/components/common/SearchResultItem.d.ts +12 -0
  18. package/dist/components/common/Sidebar/Sidebar.d.ts +12 -0
  19. package/dist/components/common/UserMenu/UserMenu.d.ts +15 -0
  20. package/dist/components/common/menu/MenuComponent.d.ts +4 -0
  21. package/dist/contexts/SidebarContext.d.ts +6 -0
  22. package/dist/examples/MeiliSearchUsageExample.d.ts +3 -0
  23. package/dist/hooks/useIsMobileSize.d.ts +2 -0
  24. package/dist/hooks/useSidebar.d.ts +1 -0
  25. package/dist/index.cjs +27 -0
  26. package/dist/index.css +1 -0
  27. package/dist/index.d.ts +8 -0
  28. package/dist/index.js +1867 -0
  29. package/dist/interfaces/components.d.ts +181 -0
  30. package/dist/main.d.ts +0 -0
  31. package/dist/providers/SidebarProvider.d.ts +4 -0
  32. package/dist/services/meiliSearchService.d.ts +47 -0
  33. package/dist/utils/searchNavigation.d.ts +43 -0
  34. package/dist/vite.svg +1 -0
  35. package/eslint.config.js +28 -0
  36. package/index.html +13 -0
  37. package/next.config.ts +35 -0
  38. package/package.json +53 -0
  39. package/public/vite.svg +1 -0
  40. package/src/@edx-frontend-platform-i18n.d.ts +1 -0
  41. package/src/App.css +66 -0
  42. package/src/App.tsx +54 -0
  43. package/src/assets/react.svg +1 -0
  44. package/src/components/common/Button/ButtonComponent.scss +3 -0
  45. package/src/components/common/Button/ButtonComponent.tsx +34 -0
  46. package/src/components/common/Footer/Footer.scss +87 -0
  47. package/src/components/common/Footer/Footer.tsx +53 -0
  48. package/src/components/common/Header/MainHeader.scss +915 -0
  49. package/src/components/common/Header/MainHeader.tsx +701 -0
  50. package/src/components/common/Header/SimpleSearchContext.tsx +194 -0
  51. package/src/components/common/NavDropdownMenu/NavDropdownMenu.tsx +58 -0
  52. package/src/components/common/SearchHighlight.tsx +64 -0
  53. package/src/components/common/SearchResultItem.tsx +162 -0
  54. package/src/components/common/Sidebar/Sidebar.scss +170 -0
  55. package/src/components/common/Sidebar/Sidebar.tsx +137 -0
  56. package/src/components/common/UserMenu/UserMenu.scss +0 -0
  57. package/src/components/common/UserMenu/UserMenu.tsx +73 -0
  58. package/src/components/common/menu/MenuComponent.module.css +12 -0
  59. package/src/components/common/menu/MenuComponent.tsx +37 -0
  60. package/src/contexts/SidebarContext.tsx +9 -0
  61. package/src/declarations.d.ts +10 -0
  62. package/src/examples/MeiliSearchUsageExample.tsx +102 -0
  63. package/src/hooks/useIsMobileSize.ts +19 -0
  64. package/src/hooks/useSidebar.ts +10 -0
  65. package/src/index.css +68 -0
  66. package/src/index.ts +21 -0
  67. package/src/interfaces/components.ts +172 -0
  68. package/src/main.tsx +11 -0
  69. package/src/providers/SidebarProvider.tsx +20 -0
  70. package/src/services/meiliSearchService.ts +233 -0
  71. package/src/styles/global-overrides.scss +1131 -0
  72. package/src/utils/searchNavigation.ts +140 -0
  73. package/src/vite-env.d.ts +1 -0
  74. package/tsconfig.app.json +26 -0
  75. package/tsconfig.json +17 -0
  76. package/tsconfig.node.json +24 -0
  77. package/vite.config.ts +34 -0
@@ -0,0 +1,170 @@
1
+ .sidebar {
2
+ width: 200px;
3
+ min-height: 100vh;
4
+ background-color: var(--bg-surface);
5
+ border-right: 1px solid var(--border-color);
6
+ position: relative;
7
+ // padding: 8px 4px;
8
+ transition: all 0.3s ease;
9
+ display: flex;
10
+ flex-direction: column;
11
+ padding: 0;
12
+ z-index: 101;
13
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
14
+ overflow: visible;
15
+
16
+ // Collapsed state styles
17
+ &.collapsed {
18
+ width: 80px;
19
+ min-width: 50px;
20
+ padding: 0;
21
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
22
+ .sidebar-btn {
23
+ padding: 14px 10px;
24
+ padding-right: 0px;
25
+ justify-content: center;
26
+ position: relative;
27
+ z-index: 25;
28
+ .btn-content {
29
+ flex-direction: column;
30
+ align-items: center;
31
+ gap: 0;
32
+ .btn-label {
33
+ display: none;
34
+ opacity: 0;
35
+ max-width: 0;
36
+ margin-left: 0;
37
+ }
38
+ }
39
+
40
+ // &:hover {
41
+ // .btn-label {
42
+ // /* Removed old CSS tooltip styles */
43
+ // }
44
+ // }
45
+ }
46
+ }
47
+
48
+ // Styles for non-standard routes
49
+ &.non-standard-route {
50
+ // When NOT collapsed (i.e., expanded state) on a non-standard route
51
+ &:not(.collapsed) {
52
+ width: 200px; // Expand to 200px
53
+ position: fixed; // Overlay content
54
+ // height: 100vh;
55
+ top: 6rem;
56
+ left: 0;
57
+ z-index: 1000; // Ensure it's above other content
58
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.3s ease; // Animate transform for slide effect
59
+ transform: translateX(0); // Ensure it's visible
60
+ margin-right: 80px;
61
+ }
62
+
63
+ }
64
+
65
+ .sidebar-buttons {
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 4px;
69
+ margin-top: 1.5rem;
70
+ margin-right: 1rem;
71
+ }
72
+
73
+ .sidebar-btn {
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: flex-start;
77
+ width: 100%;
78
+ padding: 14px 10px;
79
+ border-radius: 0 32px 32px 0;
80
+ background: transparent;
81
+ color: var(--text-secondary);
82
+ font-weight: 500;
83
+ font-size: 16px;
84
+ border: none;
85
+ transition: background 0.2s, color 0.2s;
86
+ margin: 2px 0;
87
+ text-align: left;
88
+
89
+ .btn-content {
90
+ display: flex;
91
+ flex-direction: row;
92
+ align-items: center;
93
+ width: 100%;
94
+ }
95
+
96
+ .icon-container {
97
+ font-size: 22px;
98
+ display: flex;
99
+ align-items: center;
100
+ justify-content: center;
101
+ min-width: 28px;
102
+ }
103
+
104
+ .btn-label {
105
+ font-size: 14px;
106
+ font-weight: 500;
107
+ color: inherit;
108
+ white-space: nowrap;
109
+ transition: opacity 0.2s, max-width 0.2s, margin 0.2s;
110
+ opacity: 1;
111
+ max-width: 200px;
112
+ margin-left: 0.5rem;
113
+ }
114
+ }
115
+ }
116
+
117
+ .pgn-btn-active {
118
+ background: var(--primary) !important;
119
+ color: var(--text-white) !important;
120
+
121
+ &:hover {
122
+ background-color: var(--primary-light) !important;
123
+ color: var(--primary) !important;
124
+
125
+ .icon-container,
126
+ .btn-label {
127
+ color: var(--primary) !important;
128
+ }
129
+ }
130
+
131
+ .icon-container,
132
+ .btn-label {
133
+ color: var(--text-white) !important;
134
+ }
135
+ }
136
+
137
+ .sidebar-btn {
138
+ &.pgn-btn-inactive {
139
+ color: var(--text-secondary) !important;
140
+
141
+ &:hover {
142
+ color: var(--primary) !important;
143
+ }
144
+ }
145
+ }
146
+
147
+ .sidebar-extra-space {
148
+ width: 80px;
149
+ // margin-right: 80px ; // Adjust margin for full width panel
150
+ }
151
+
152
+ // RTL-specific tooltip adjustments
153
+ [dir="rtl"] .sidebar {
154
+ .tooltip {
155
+ // Ensure tooltip appears on the left side for RTL
156
+ &.bs-tooltip-left {
157
+ margin-right: 8px;
158
+ }
159
+ }
160
+
161
+ // Additional RTL adjustments for collapsed state
162
+ &.collapsed {
163
+ .tooltip {
164
+ // Fine-tune positioning for RTL collapsed sidebar
165
+ &.bs-tooltip-left {
166
+ transform: translateX(-4px);
167
+ }
168
+ }
169
+ }
170
+ }
File without changes
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { ButtonComponentProps } from '../../../interfaces/components';
3
+ declare const ButtonComponent: React.FC<ButtonComponentProps>;
4
+ export default ButtonComponent;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { FooterProps } from '../../../interfaces/components';
3
+ declare const Footer: React.FC<FooterProps>;
4
+ export default Footer;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { MainHeaderProps } from '../../../interfaces/components';
3
+ declare const MainHeader: React.FC<MainHeaderProps>;
4
+ export default MainHeader;
@@ -0,0 +1,36 @@
1
+ import { default as React } from 'react';
2
+ import { MeiliSearchConfig } from '../../../interfaces/components';
3
+ export interface SearchResult {
4
+ id: string;
5
+ title: string;
6
+ type: string;
7
+ url?: string;
8
+ description?: string;
9
+ block_type?: string;
10
+ published?: string;
11
+ _formatted?: {
12
+ display_name?: string;
13
+ description?: string;
14
+ published?: string;
15
+ };
16
+ }
17
+ export interface SimpleSearchContextData {
18
+ searchKeywords: string;
19
+ setSearchKeywords: React.Dispatch<React.SetStateAction<string>>;
20
+ searchResults: SearchResult[];
21
+ totalHits: number;
22
+ isLoading: boolean;
23
+ hasError: boolean;
24
+ errorMessage: string | null;
25
+ facets: Record<string, Record<string, number>> | null;
26
+ performSearch: (query: string) => Promise<void>;
27
+ clearSearch: () => void;
28
+ hasNextPage: boolean;
29
+ fetchNextPage: () => void;
30
+ isFetchingNextPage: boolean;
31
+ }
32
+ export declare const SimpleSearchProvider: React.FC<{
33
+ children: React.ReactNode;
34
+ meiliSearchConfig: MeiliSearchConfig;
35
+ }>;
36
+ export declare const useSimpleSearch: () => SimpleSearchContextData;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ interface NavDropdownMenuProps {
3
+ id: string;
4
+ buttonTitle: React.ReactNode;
5
+ items: {
6
+ href: string;
7
+ title: string;
8
+ }[];
9
+ }
10
+ declare const NavDropdownMenu: React.FC<NavDropdownMenuProps>;
11
+ export default NavDropdownMenu;
@@ -0,0 +1,11 @@
1
+ import { default as React } from 'react';
2
+ interface HighlightProps {
3
+ text: string;
4
+ highlightTag?: string;
5
+ }
6
+ /**
7
+ * Component to highlight search terms in text
8
+ * Handles MeiliSearch highlight tags like __meili-highlight__term__/meili-highlight__
9
+ */
10
+ declare const Highlight: React.FC<HighlightProps>;
11
+ export default Highlight;
@@ -0,0 +1,12 @@
1
+ import { default as React } from 'react';
2
+ import { MeiliSearchResult } from '../../interfaces/components';
3
+ interface SearchResultItemProps {
4
+ result: MeiliSearchResult;
5
+ onNavigate?: (url: string) => void;
6
+ baseUrl?: string;
7
+ }
8
+ /**
9
+ * Single search result item component
10
+ */
11
+ declare const SearchResultItem: React.FC<SearchResultItemProps>;
12
+ export default SearchResultItem;
@@ -0,0 +1,12 @@
1
+ import { default as React } from 'react';
2
+ interface SidebarProps {
3
+ buttons: {
4
+ label: string;
5
+ path: string;
6
+ icon: React.ReactElement;
7
+ }[];
8
+ onNavigate: (path: string) => void;
9
+ presentPath: string;
10
+ }
11
+ declare const Sidebar: React.FC<SidebarProps>;
12
+ export default Sidebar;
@@ -0,0 +1,15 @@
1
+ import { default as React } from 'react';
2
+ interface UserMenuProps {
3
+ username: string;
4
+ studioBaseUrl?: string;
5
+ logoutUrl?: string;
6
+ authenticatedUserAvatar?: string | null;
7
+ isMobile?: boolean;
8
+ isAdmin?: any;
9
+ menuItems: {
10
+ href: string;
11
+ title: string;
12
+ }[];
13
+ }
14
+ declare const UserMenu: React.FC<UserMenuProps>;
15
+ export default UserMenu;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { MenuComponentProps } from '../../../interfaces/components';
3
+ declare const MenuComponent: React.FC<MenuComponentProps>;
4
+ export default MenuComponent;
@@ -0,0 +1,6 @@
1
+ export interface SidebarContextType {
2
+ isCollapsed: boolean;
3
+ toggleSidebar: () => void;
4
+ setSidebarCollapsed: (collapsed: boolean) => void;
5
+ }
6
+ export declare const SidebarContext: import('react').Context<SidebarContextType | undefined>;
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ declare const MeiliSearchUsageExample: React.FC;
3
+ export default MeiliSearchUsageExample;
@@ -0,0 +1,2 @@
1
+ declare const useIsMobileSize: (breakpoint?: number) => boolean;
2
+ export default useIsMobileSize;
@@ -0,0 +1 @@
1
+ export declare const useSidebar: () => import('../contexts/SidebarContext').SidebarContextType;
package/dist/index.cjs ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const w=require("react"),v=require("@openedx/paragon");function _r(t){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const i in t)if(i!=="default"){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(s,i,n.get?n:{enumerable:!0,get:()=>t[i]})}}return s.default=t,Object.freeze(s)}const V=_r(w);var we={exports:{}},pe={};/*
2
+ object-assign
3
+ (c) Sindre Sorhus
4
+ @license MIT
5
+ */var Oe,Ve;function rr(){if(Ve)return Oe;Ve=1;var t=Object.getOwnPropertySymbols,s=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function n(m){if(m==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(m)}function y(){try{if(!Object.assign)return!1;var m=new String("abc");if(m[5]="de",Object.getOwnPropertyNames(m)[0]==="5")return!1;for(var j={},p=0;p<10;p++)j["_"+String.fromCharCode(p)]=p;var g=Object.getOwnPropertyNames(j).map(function(o){return j[o]});if(g.join("")!=="0123456789")return!1;var c={};return"abcdefghijklmnopqrst".split("").forEach(function(o){c[o]=o}),Object.keys(Object.assign({},c)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}return Oe=y()?Object.assign:function(m,j){for(var p,g=n(m),c,o=1;o<arguments.length;o++){p=Object(arguments[o]);for(var d in p)s.call(p,d)&&(g[d]=p[d]);if(t){c=t(p);for(var f=0;f<c.length;f++)i.call(p,c[f])&&(g[c[f]]=p[c[f]])}}return g},Oe}/** @license React v17.0.2
6
+ * react-jsx-runtime.production.min.js
7
+ *
8
+ * Copyright (c) Facebook, Inc. and its affiliates.
9
+ *
10
+ * This source code is licensed under the MIT license found in the
11
+ * LICENSE file in the root directory of this source tree.
12
+ */var We;function Sr(){if(We)return pe;We=1,rr();var t=w,s=60103;if(pe.Fragment=60107,typeof Symbol=="function"&&Symbol.for){var i=Symbol.for;s=i("react.element"),pe.Fragment=i("react.fragment")}var n=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,y=Object.prototype.hasOwnProperty,m={key:!0,ref:!0,__self:!0,__source:!0};function j(p,g,c){var o,d={},f=null,b=null;c!==void 0&&(f=""+c),g.key!==void 0&&(f=""+g.key),g.ref!==void 0&&(b=g.ref);for(o in g)y.call(g,o)&&!m.hasOwnProperty(o)&&(d[o]=g[o]);if(p&&p.defaultProps)for(o in g=p.defaultProps,g)d[o]===void 0&&(d[o]=g[o]);return{$$typeof:s,type:p,key:f,ref:b,props:d,_owner:n.current}}return pe.jsx=j,pe.jsxs=j,pe}var Re={};/** @license React v17.0.2
13
+ * react-jsx-runtime.development.js
14
+ *
15
+ * Copyright (c) Facebook, Inc. and its affiliates.
16
+ *
17
+ * This source code is licensed under the MIT license found in the
18
+ * LICENSE file in the root directory of this source tree.
19
+ */var Fe;function Er(){return Fe||(Fe=1,(function(t){process.env.NODE_ENV!=="production"&&(function(){var s=w,i=rr(),n=60103,y=60106;t.Fragment=60107;var m=60108,j=60114,p=60109,g=60110,c=60112,o=60113,d=60120,f=60115,b=60116,u=60121,I=60122,U=60117,S=60129,D=60131;if(typeof Symbol=="function"&&Symbol.for){var O=Symbol.for;n=O("react.element"),y=O("react.portal"),t.Fragment=O("react.fragment"),m=O("react.strict_mode"),j=O("react.profiler"),p=O("react.provider"),g=O("react.context"),c=O("react.forward_ref"),o=O("react.suspense"),d=O("react.suspense_list"),f=O("react.memo"),b=O("react.lazy"),u=O("react.block"),I=O("react.server.block"),U=O("react.fundamental"),O("react.scope"),O("react.opaque.id"),S=O("react.debug_trace_mode"),O("react.offscreen"),D=O("react.legacy_hidden")}var G=typeof Symbol=="function"&&Symbol.iterator,$="@@iterator";function X(e){if(e===null||typeof e!="object")return null;var a=G&&e[G]||e[$];return typeof a=="function"?a:null}var H=s.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function R(e){{for(var a=arguments.length,l=new Array(a>1?a-1:0),x=1;x<a;x++)l[x-1]=arguments[x];Z("error",e,l)}}function Z(e,a,l){{var x=H.ReactDebugCurrentFrame,T=x.getStackAddendum();T!==""&&(a+="%s",l=l.concat([T]));var k=l.map(function(E){return""+E});k.unshift("Warning: "+a),Function.prototype.apply.call(console[e],console,k)}}var ee=!1;function z(e){return!!(typeof e=="string"||typeof e=="function"||e===t.Fragment||e===j||e===S||e===m||e===o||e===d||e===D||ee||typeof e=="object"&&e!==null&&(e.$$typeof===b||e.$$typeof===f||e.$$typeof===p||e.$$typeof===g||e.$$typeof===c||e.$$typeof===U||e.$$typeof===u||e[0]===I))}function L(e,a,l){var x=a.displayName||a.name||"";return e.displayName||(x!==""?l+"("+x+")":l)}function W(e){return e.displayName||"Context"}function A(e){if(e==null)return null;if(typeof e.tag=="number"&&R("Received an unexpected object in getComponentName(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case t.Fragment:return"Fragment";case y:return"Portal";case j:return"Profiler";case m:return"StrictMode";case o:return"Suspense";case d:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case g:var a=e;return W(a)+".Consumer";case p:var l=e;return W(l._context)+".Provider";case c:return L(e,e.render,"ForwardRef");case f:return A(e.type);case u:return A(e._render);case b:{var x=e,T=x._payload,k=x._init;try{return A(k(T))}catch{return null}}}return null}var q=0,C,F,K,Q,oe,J,ne;function ie(){}ie.__reactDisabledLog=!0;function Ne(){{if(q===0){C=console.log,F=console.info,K=console.warn,Q=console.error,oe=console.group,J=console.groupCollapsed,ne=console.groupEnd;var e={configurable:!0,enumerable:!0,value:ie,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}q++}}function je(){{if(q--,q===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:i({},e,{value:C}),info:i({},e,{value:F}),warn:i({},e,{value:K}),error:i({},e,{value:Q}),group:i({},e,{value:oe}),groupCollapsed:i({},e,{value:J}),groupEnd:i({},e,{value:ne})})}q<0&&R("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var ce=H.ReactCurrentDispatcher,le;function se(e,a,l){{if(le===void 0)try{throw Error()}catch(T){var x=T.stack.trim().match(/\n( *(at )?)/);le=x&&x[1]||""}return`
20
+ `+le+e}}var ue=!1,ae;{var xe=typeof WeakMap=="function"?WeakMap:Map;ae=new xe}function me(e,a){if(!e||ue)return"";{var l=ae.get(e);if(l!==void 0)return l}var x;ue=!0;var T=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var k;k=ce.current,ce.current=null,Ne();try{if(a){var E=function(){throw Error()};if(Object.defineProperty(E.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(E,[])}catch(te){x=te}Reflect.construct(e,[],E)}else{try{E.call()}catch(te){x=te}e.call(E.prototype)}}else{try{throw Error()}catch(te){x=te}e()}}catch(te){if(te&&x&&typeof te.stack=="string"){for(var _=te.stack.split(`
21
+ `),Y=x.stack.split(`
22
+ `),P=_.length-1,M=Y.length-1;P>=1&&M>=0&&_[P]!==Y[M];)M--;for(;P>=1&&M>=0;P--,M--)if(_[P]!==Y[M]){if(P!==1||M!==1)do if(P--,M--,M<0||_[P]!==Y[M]){var re=`
23
+ `+_[P].replace(" at new "," at ");return typeof e=="function"&&ae.set(e,re),re}while(P>=1&&M>=0);break}}}finally{ue=!1,ce.current=k,je(),Error.prepareStackTrace=T}var he=e?e.displayName||e.name:"",qe=he?se(he):"";return typeof e=="function"&&ae.set(e,qe),qe}function ge(e,a,l){return me(e,!1)}function h(e){var a=e.prototype;return!!(a&&a.isReactComponent)}function N(e,a,l){if(e==null)return"";if(typeof e=="function")return me(e,h(e));if(typeof e=="string")return se(e);switch(e){case o:return se("Suspense");case d:return se("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case c:return ge(e.render);case f:return N(e.type,a,l);case u:return ge(e._render);case b:{var x=e,T=x._payload,k=x._init;try{return N(k(T),a,l)}catch{}}}return""}var B={},de=H.ReactDebugCurrentFrame;function be(e){if(e){var a=e._owner,l=N(e.type,e._source,a?a.type:null);de.setExtraStackFrame(l)}else de.setExtraStackFrame(null)}function ar(e,a,l,x,T){{var k=Function.call.bind(Object.prototype.hasOwnProperty);for(var E in e)if(k(e,E)){var _=void 0;try{if(typeof e[E]!="function"){var Y=Error((x||"React class")+": "+l+" type `"+E+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[E]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw Y.name="Invariant Violation",Y}_=e[E](a,E,x,l,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(P){_=P}_&&!(_ instanceof Error)&&(be(T),R("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",x||"React class",l,E,typeof _),be(null)),_ instanceof Error&&!(_.message in B)&&(B[_.message]=!0,be(T),R("Failed %s type: %s",l,_.message),be(null))}}}var Pe=H.ReactCurrentOwner,_e=Object.prototype.hasOwnProperty,or={key:!0,ref:!0,__self:!0,__source:!0},Ie,Me;function cr(e){if(_e.call(e,"ref")){var a=Object.getOwnPropertyDescriptor(e,"ref").get;if(a&&a.isReactWarning)return!1}return e.ref!==void 0}function lr(e){if(_e.call(e,"key")){var a=Object.getOwnPropertyDescriptor(e,"key").get;if(a&&a.isReactWarning)return!1}return e.key!==void 0}function ur(e,a){typeof e.ref=="string"&&Pe.current}function dr(e,a){{var l=function(){Ie||(Ie=!0,R("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",a))};l.isReactWarning=!0,Object.defineProperty(e,"key",{get:l,configurable:!0})}}function fr(e,a){{var l=function(){Me||(Me=!0,R("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",a))};l.isReactWarning=!0,Object.defineProperty(e,"ref",{get:l,configurable:!0})}}var hr=function(e,a,l,x,T,k,E){var _={$$typeof:n,type:e,key:a,ref:l,props:E,_owner:k};return _._store={},Object.defineProperty(_._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(_,"_self",{configurable:!1,enumerable:!1,writable:!1,value:x}),Object.defineProperty(_,"_source",{configurable:!1,enumerable:!1,writable:!1,value:T}),Object.freeze&&(Object.freeze(_.props),Object.freeze(_)),_};function pr(e,a,l,x,T){{var k,E={},_=null,Y=null;l!==void 0&&(_=""+l),lr(a)&&(_=""+a.key),cr(a)&&(Y=a.ref,ur(a,T));for(k in a)_e.call(a,k)&&!or.hasOwnProperty(k)&&(E[k]=a[k]);if(e&&e.defaultProps){var P=e.defaultProps;for(k in P)E[k]===void 0&&(E[k]=P[k])}if(_||Y){var M=typeof e=="function"?e.displayName||e.name||"Unknown":e;_&&dr(E,M),Y&&fr(E,M)}return hr(e,_,Y,T,x,Pe.current,E)}}var Se=H.ReactCurrentOwner,Ae=H.ReactDebugCurrentFrame;function fe(e){if(e){var a=e._owner,l=N(e.type,e._source,a?a.type:null);Ae.setExtraStackFrame(l)}else Ae.setExtraStackFrame(null)}var Ee;Ee=!1;function Ce(e){return typeof e=="object"&&e!==null&&e.$$typeof===n}function De(){{if(Se.current){var e=A(Se.current.type);if(e)return`
24
+
25
+ Check the render method of \``+e+"`."}return""}}function mr(e){return""}var $e={};function gr(e){{var a=De();if(!a){var l=typeof e=="string"?e:e.displayName||e.name;l&&(a=`
26
+
27
+ Check the top-level render call using <`+l+">.")}return a}}function Le(e,a){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var l=gr(a);if($e[l])return;$e[l]=!0;var x="";e&&e._owner&&e._owner!==Se.current&&(x=" It was passed a child from "+A(e._owner.type)+"."),fe(e),R('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',l,x),fe(null)}}function He(e,a){{if(typeof e!="object")return;if(Array.isArray(e))for(var l=0;l<e.length;l++){var x=e[l];Ce(x)&&Le(x,a)}else if(Ce(e))e._store&&(e._store.validated=!0);else if(e){var T=X(e);if(typeof T=="function"&&T!==e.entries)for(var k=T.call(e),E;!(E=k.next()).done;)Ce(E.value)&&Le(E.value,a)}}}function vr(e){{var a=e.type;if(a==null||typeof a=="string")return;var l;if(typeof a=="function")l=a.propTypes;else if(typeof a=="object"&&(a.$$typeof===c||a.$$typeof===f))l=a.propTypes;else return;if(l){var x=A(a);ar(l,e.props,"prop",x,e)}else if(a.PropTypes!==void 0&&!Ee){Ee=!0;var T=A(a);R("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",T||"Unknown")}typeof a.getDefaultProps=="function"&&!a.getDefaultProps.isReactClassApproved&&R("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function xr(e){{for(var a=Object.keys(e.props),l=0;l<a.length;l++){var x=a[l];if(x!=="children"&&x!=="key"){fe(e),R("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",x),fe(null);break}}e.ref!==null&&(fe(e),R("Invalid attribute `ref` supplied to `React.Fragment`."),fe(null))}}function ze(e,a,l,x,T,k){{var E=z(e);if(!E){var _="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(_+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var Y=mr();Y?_+=Y:_+=De();var P;e===null?P="null":Array.isArray(e)?P="array":e!==void 0&&e.$$typeof===n?(P="<"+(A(e.type)||"Unknown")+" />",_=" Did you accidentally export a JSX literal instead of a component?"):P=typeof e,R("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",P,_)}var M=pr(e,a,l,T,k);if(M==null)return M;if(E){var re=a.children;if(re!==void 0)if(x)if(Array.isArray(re)){for(var he=0;he<re.length;he++)He(re[he],e);Object.freeze&&Object.freeze(re)}else R("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else He(re,e)}return e===t.Fragment?xr(M):vr(M),M}}function br(e,a,l){return ze(e,a,l,!0)}function wr(e,a,l){return ze(e,a,l,!1)}var yr=wr,jr=br;t.jsx=yr,t.jsxs=jr})()})(Re)),Re}var Ke;function Cr(){return Ke||(Ke=1,process.env.NODE_ENV==="production"?we.exports=Sr():we.exports=Er()),we.exports}var r=Cr();const Or=({contactInfo:t,quickLinks:s,exploreLinks:i,logoUrl:n,copyrights:y})=>{const m=j=>j??"left";return r.jsxs("footer",{className:"footer",children:[r.jsxs("div",{className:"container",children:[r.jsxs("div",{className:`section ${m(t.align)}`,children:[r.jsx("div",{className:"footer-brand-logo",children:r.jsx("img",{src:n,alt:"Logo"})}),r.jsx("p",{children:t.content.shortdesc}),r.jsxs("p",{children:[t.content.location.label,", ",t.content.location.value]}),r.jsxs("p",{children:["📞 ",t.content.phonenumber]})]}),r.jsx("div",{className:`section ${m(s.align)}`,children:r.jsxs("ul",{children:[r.jsx("h3",{children:"Quick Links"}),s.content.map((j,p)=>r.jsx("li",{children:r.jsx("a",{href:j.link,children:j.label})},p))]})}),r.jsx("div",{className:`section ${m(i.align)}`,children:r.jsxs("ul",{children:[r.jsx("h3",{children:"Explore"}),i.content.map((j,p)=>r.jsx("li",{children:r.jsx("a",{href:j.link,children:j.label})},p))]})})]}),r.jsx("div",{className:"copyright",children:r.jsx("p",{children:y})})]})},tr=w.createContext(void 0),Rr=({children:t})=>{const[s,i]=w.useState(!1),n=()=>{i(m=>!m)},y=m=>{i(m)};return r.jsx(tr.Provider,{value:{isCollapsed:s,toggleSidebar:n,setSidebarCollapsed:y},children:t})},Te=()=>{const t=w.useContext(tr);if(t===void 0)throw new Error("useSidebar must be used within a SidebarProvider");return t},kr=({buttons:t,onNavigate:s,presentPath:i})=>{const{isCollapsed:n,setSidebarCollapsed:y}=Te(),[m,j]=w.useState(!0),p=w.useRef(null),[g,c]=w.useState(()=>document.dir==="rtl"||document.documentElement.dir==="rtl");return w.useEffect(()=>{const o=()=>{c(document.dir==="rtl"||document.documentElement.dir==="rtl")},d=new MutationObserver(o);return d.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]}),()=>d.disconnect()},[]),w.useEffect(()=>{const o=t.some(d=>d.path===i);j(o),!o&&!n&&i.includes("/course/")&&y(!0)},[i]),w.useEffect(()=>{const o=d=>{!m&&p.current&&!p.current.contains(d.target)&&i.includes("/course/")&&(n||y(!0))};return document.addEventListener("mousedown",o),()=>{document.removeEventListener("mousedown",o)}},[m,n,y]),r.jsxs(r.Fragment,{children:[r.jsx("div",{className:`sidebar ${n?"collapsed":""}`,ref:p,children:r.jsx("div",{className:"sidebar-buttons",children:t.map(o=>{const d=o.path===i||(i.includes("/course/")||i.includes("/course_rerun/"))&&o.path==="/my-courses"||i.includes("/library/")&&o.path==="/libraries"||i.includes("/taxonomy/")&&o.path==="/taxonomies";return r.jsx(v.OverlayTrigger,{placement:g?"left":"right",overlay:r.jsx(v.Tooltip,{id:`tooltip-${o.path}`,children:o.label}),show:n?void 0:!1,popperConfig:{modifiers:[{name:"preventOverflow",options:{altAxis:!0,boundary:"viewport"}}]},children:r.jsx(v.Button,{variant:"tertiary",className:`sidebar-btn ${d?"pgn-btn-active":"pgn-btn-inactive"}`,onClick:()=>s(o.path),children:r.jsxs("div",{className:"btn-content",children:[r.jsx("span",{className:"icon-container",children:o.icon}),r.jsx("span",{className:"btn-label",children:o.label})]})})},o.path)})})}),!m&&!n&&r.jsx("div",{className:"sidebar-extra-space"})]})},Tr=(t=768)=>{const[s,i]=w.useState(!1);return w.useEffect(()=>{const n=()=>{i(window.innerWidth<=t)};return n(),window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[t]),s},Ye=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M10.09 15.59 11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM21 3H3v6h2V5h14v14H5v-4H3v6h18V3z",fill:"currentColor"})),Je=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M21 3H3v18h18V3zm-8.99 15c-.7 0-1.26-.56-1.26-1.26 0-.71.56-1.25 1.26-1.25.71 0 1.25.54 1.25 1.25-.01.69-.54 1.26-1.25 1.26zm3.01-7.4c-.76 1.11-1.48 1.46-1.87 2.17-.16.29-.22.48-.22 1.41h-1.82c0-.49-.08-1.29.31-1.98.49-.87 1.42-1.39 1.96-2.16.57-.81.25-2.33-1.37-2.33-1.06 0-1.58.8-1.8 1.48l-1.65-.7C9.01 7.15 10.22 6 11.99 6c1.48 0 2.49.67 3.01 1.52.44.72.7 2.07.02 3.08z",fill:"currentColor"})),Nr=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z",fill:"currentColor"})),Pr=t=>V.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},V.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2Zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2Zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2Z",fill:"currentColor"})),Ue=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M12 22c1.1 0 2-.9 2-2h-4a2 2 0 0 0 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V2.5h-3v2.18C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z",fill:"currentColor"})),Ir=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M19 19H5V5h7V3H3v18h18v-9h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z",fill:"currentColor"})),Mr=t=>V.createElement("svg",{width:24,height:24,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},V.createElement("path",{d:"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5Zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14Z",fill:"currentColor"})),Ge=t=>V.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",...t},V.createElement("path",{d:"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46A7.93 7.93 0 0 0 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74A7.93 7.93 0 0 0 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z",fill:"currentColor"})),Ar=({id:t,buttonTitle:s,items:i})=>(console.log("NavDropdownMenu Props:",i),r.jsx(v.DropdownButton,{id:t,title:s,variant:"tertiary",className:"mr-2",children:i.map(n=>r.jsx(v.Dropdown.Item,{href:n.href,as:"a",className:"small",children:n.title},`${n.title}-dropdown-item`))})),Xe=({username:t,authenticatedUserAvatar:s,isMobile:i,menuItems:n})=>{const y=s?r.jsx("img",{className:"d-block w-100 h-100",src:s,alt:t,"data-testid":"avatar-image"}):r.jsx(v.Avatar,{size:"sm",className:"mr-2",alt:"avatar","data-testid":"avatar-icon"}),m=i?y:r.jsxs(r.Fragment,{children:[t,"   ",y]});return r.jsx(Ar,{buttonTitle:m,id:"user-dropdown-menu",items:n})};var ve={},Ze;function Dr(){if(Ze)return ve;Ze=1,Object.defineProperty(ve,"__esModule",{value:!0}),ve.parse=j,ve.serialize=c;const t=/^[\u0021-\u003A\u003C\u003E-\u007E]+$/,s=/^[\u0021-\u003A\u003C-\u007E]*$/,i=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,n=/^[\u0020-\u003A\u003D-\u007E]*$/,y=Object.prototype.toString,m=(()=>{const f=function(){};return f.prototype=Object.create(null),f})();function j(f,b){const u=new m,I=f.length;if(I<2)return u;const U=(b==null?void 0:b.decode)||o;let S=0;do{const D=f.indexOf("=",S);if(D===-1)break;const O=f.indexOf(";",S),G=O===-1?I:O;if(D>G){S=f.lastIndexOf(";",D-1)+1;continue}const $=p(f,S,D),X=g(f,D,$),H=f.slice($,X);if(u[H]===void 0){let R=p(f,D+1,G),Z=g(f,G,R);const ee=U(f.slice(R,Z));u[H]=ee}S=G+1}while(S<I);return u}function p(f,b,u){do{const I=f.charCodeAt(b);if(I!==32&&I!==9)return b}while(++b<u);return u}function g(f,b,u){for(;b>u;){const I=f.charCodeAt(--b);if(I!==32&&I!==9)return b+1}return u}function c(f,b,u){const I=(u==null?void 0:u.encode)||encodeURIComponent;if(!t.test(f))throw new TypeError(`argument name is invalid: ${f}`);const U=I(b);if(!s.test(U))throw new TypeError(`argument val is invalid: ${b}`);let S=f+"="+U;if(!u)return S;if(u.maxAge!==void 0){if(!Number.isInteger(u.maxAge))throw new TypeError(`option maxAge is invalid: ${u.maxAge}`);S+="; Max-Age="+u.maxAge}if(u.domain){if(!i.test(u.domain))throw new TypeError(`option domain is invalid: ${u.domain}`);S+="; Domain="+u.domain}if(u.path){if(!n.test(u.path))throw new TypeError(`option path is invalid: ${u.path}`);S+="; Path="+u.path}if(u.expires){if(!d(u.expires)||!Number.isFinite(u.expires.valueOf()))throw new TypeError(`option expires is invalid: ${u.expires}`);S+="; Expires="+u.expires.toUTCString()}if(u.httpOnly&&(S+="; HttpOnly"),u.secure&&(S+="; Secure"),u.partitioned&&(S+="; Partitioned"),u.priority)switch(typeof u.priority=="string"?u.priority.toLowerCase():void 0){case"low":S+="; Priority=Low";break;case"medium":S+="; Priority=Medium";break;case"high":S+="; Priority=High";break;default:throw new TypeError(`option priority is invalid: ${u.priority}`)}if(u.sameSite)switch(typeof u.sameSite=="string"?u.sameSite.toLowerCase():u.sameSite){case!0:case"strict":S+="; SameSite=Strict";break;case"lax":S+="; SameSite=Lax";break;case"none":S+="; SameSite=None";break;default:throw new TypeError(`option sameSite is invalid: ${u.sameSite}`)}return S}function o(f){if(f.indexOf("%")===-1)return f;try{return decodeURIComponent(f)}catch{return f}}function d(f){return y.call(f)==="[object Date]"}return ve}var ye=Dr();function $r(){const t=typeof global>"u"?void 0:global.TEST_HAS_DOCUMENT_COOKIE;return typeof t=="boolean"?t:typeof document=="object"&&typeof document.cookie=="string"}function Lr(t){return typeof t=="string"?ye.parse(t):typeof t=="object"&&t!==null?t:{}}function ke(t,s={}){const i=Hr(t);if(!s.doNotParse)try{return JSON.parse(i)}catch{}return t}function Hr(t){return t&&t[0]==="j"&&t[1]===":"?t.substr(2):t}class zr{constructor(s,i={}){this.changeListeners=[],this.HAS_DOCUMENT_COOKIE=!1,this.update=()=>{if(!this.HAS_DOCUMENT_COOKIE)return;const y=this.cookies;this.cookies=ye.parse(document.cookie),this._checkChanges(y)};const n=typeof document>"u"?"":document.cookie;this.cookies=Lr(s||n),this.defaultSetOptions=i,this.HAS_DOCUMENT_COOKIE=$r()}_emitChange(s){for(let i=0;i<this.changeListeners.length;++i)this.changeListeners[i](s)}_checkChanges(s){new Set(Object.keys(s).concat(Object.keys(this.cookies))).forEach(n=>{s[n]!==this.cookies[n]&&this._emitChange({name:n,value:ke(this.cookies[n])})})}_startPolling(){this.pollingInterval=setInterval(this.update,300)}_stopPolling(){this.pollingInterval&&clearInterval(this.pollingInterval)}get(s,i={}){return i.doNotUpdate||this.update(),ke(this.cookies[s],i)}getAll(s={}){s.doNotUpdate||this.update();const i={};for(let n in this.cookies)i[n]=ke(this.cookies[n],s);return i}set(s,i,n){n?n=Object.assign(Object.assign({},this.defaultSetOptions),n):n=this.defaultSetOptions;const y=typeof i=="string"?i:JSON.stringify(i);this.cookies=Object.assign(Object.assign({},this.cookies),{[s]:y}),this.HAS_DOCUMENT_COOKIE&&(document.cookie=ye.serialize(s,y,n)),this._emitChange({name:s,value:i,options:n})}remove(s,i){const n=i=Object.assign(Object.assign(Object.assign({},this.defaultSetOptions),i),{expires:new Date(1970,1,1,0,0,1),maxAge:0});this.cookies=Object.assign({},this.cookies),delete this.cookies[s],this.HAS_DOCUMENT_COOKIE&&(document.cookie=ye.serialize(s,"",n)),this._emitChange({name:s,value:void 0,options:i})}addChangeListener(s){this.changeListeners.push(s),this.HAS_DOCUMENT_COOKIE&&this.changeListeners.length===1&&(typeof window=="object"&&"cookieStore"in window?window.cookieStore.addEventListener("change",this.update):this._startPolling())}removeChangeListener(s){const i=this.changeListeners.indexOf(s);i>=0&&this.changeListeners.splice(i,1),this.HAS_DOCUMENT_COOKIE&&this.changeListeners.length===0&&(typeof window=="object"&&"cookieStore"in window?window.cookieStore.removeEventListener("change",this.update):this._stopPolling())}removeAllChangeListeners(){for(;this.changeListeners.length>0;)this.removeChangeListener(this.changeListeners[0])}}class qr{constructor(s){if(!s.host)throw new Error("MeiliSearch host is required");if(!s.apiKey)throw new Error("MeiliSearch apiKey is required");if(!s.indexName)throw new Error("MeiliSearch indexName is required");this.config=s,this.headers={"Content-Type":"application/json",Authorization:`Bearer ${s.apiKey}`,"X-Meilisearch-Client":"Meilisearch JavaScript (v0.41.0)"}}updateHeadersFromClient(s){s&&s.httpRequest&&s.httpRequest.headers&&(this.headers={"Content-Type":s.httpRequest.headers["Content-Type"]||"application/json",Authorization:s.httpRequest.headers.Authorization||`Bearer ${this.config.apiKey}`,"X-Meilisearch-Client":s.httpRequest.headers["X-Meilisearch-Client"]||"Meilisearch JavaScript (v0.41.0)"})}async search(s,i={}){const{limit:n=20,offset:y=0,filter:m=['type = "course_block"'],attributesToHighlight:j=["display_name","description","published"],attributesToCrop:p=["description","published"],sort:g=[]}=i;if(!this.config.indexName)throw new Error("MeiliSearch indexName is required");const c={queries:[{indexUid:this.config.indexName,q:s,filter:[[],...m],attributesToHighlight:j,highlightPreTag:"__meili-highlight__",highlightPostTag:"__/meili-highlight__",attributesToCrop:p,sort:g,offset:y,limit:n},{indexUid:this.config.indexName,facets:["block_type","content.problem_types"],filter:m,limit:0}]},o={...this.headers};try{const d=await fetch(`${this.config.host}/multi-search`,{method:"POST",headers:o,body:JSON.stringify(c)});if(!d.ok)throw new Error(`MeiliSearch API error: ${d.status} ${d.statusText}`);const f=await d.json(),b=f.results[0],u=f.results[1];return{hits:b.hits||[],totalHits:b.estimatedTotalHits||0,facets:u.facetDistribution,processingTimeMs:b.processingTimeMs}}catch(d){throw console.error("MeiliSearch service error:",d),new Error(`Search failed: ${d instanceof Error?d.message:"Unknown error"}`)}}async simpleSearch(s,i={}){const{limit:n=20,offset:y=0,filter:m=['type = "course_block"'],attributesToHighlight:j=["display_name","description","published"],attributesToCrop:p=["description","published"],sort:g=[]}=i,c={queries:[{indexUid:this.config.indexName,q:s,filter:[[],...m],attributesToHighlight:j,highlightPreTag:"__meili-highlight__",highlightPostTag:"__/meili-highlight__",attributesToCrop:p,sort:g,offset:y,limit:n}]},o={...this.headers};try{const d=await fetch(`${this.config.host}/multi-search`,{method:"POST",headers:o,body:JSON.stringify(c)});if(!d.ok)throw new Error(`MeiliSearch API error: ${d.status} ${d.statusText}`);const b=(await d.json()).results[0];return{hits:b.hits||[],totalHits:b.estimatedTotalHits||0,processingTimeMs:b.processingTimeMs}}catch(d){throw console.error("MeiliSearch service error:",d),new Error(`Search failed: ${d instanceof Error?d.message:"Unknown error"}`)}}async checkConnection(){try{return(await fetch(`${this.config.host}/health`,{method:"GET",headers:{Authorization:`Bearer ${this.config.apiKey}`,"X-Meilisearch-Client":"Meilisearch JavaScript (v0.41.0)"}})).ok}catch(s){return console.error("MeiliSearch connection check failed:",s),!1}}}const nr=t=>new qr(t);function ir(t,s){const{contextKey:i,usageKey:n}=t;return i?i.startsWith("course-v1:")?`${s||""}/course/${i}?show=${encodeURIComponent(n||"")}`:i.startsWith("library-v1:")?`${s||""}/library/${i}`:"#":"#"}function Vr(t,s,i){const n=ir(t,s);return n==="#"?(console.warn("Could not generate URL for search hit:",t),"#"):(i?i(n):(n.startsWith("http"),window.location.href=n),n)}const Qe=({text:t,highlightTag:s="__meili-highlight__"})=>{if(!t)return null;const i="__/meili-highlight__",n=t.split(s),y=[];return n.forEach((m,j)=>{if(j===0)m&&y.push(m);else{const p=m.indexOf(i);if(p!==-1){const g=m.substring(0,p),c=m.substring(p+i.length);g&&y.push(r.jsx("mark",{className:"search-highlight",children:g},`highlight-${j}`)),c&&y.push(c)}else y.push(r.jsx("mark",{className:"search-highlight",children:m},`highlight-${j}`))}}),r.jsx(r.Fragment,{children:y})};function Wr(t){return{html:"text",video:"video",problem:"quiz",vertical:"folder",sequential:"folder",chapter:"folder",about:"info",static_tab:"text",openassessment:"quiz",lti_consumer:"link",pdf:"file",scorm:"file",itembank:"library",library_content:"library"}[t]||"text"}const Be=({result:t,onNavigate:s,baseUrl:i})=>{var g,c;const n=o=>{var b;o.preventDefault(),o.stopPropagation();const d={id:t.id,blockType:t.block_type||t.type,contextKey:t.context_key,usageKey:t.usage_key,breadcrumbs:((b=t.breadcrumbs)==null?void 0:b.map(u=>({displayName:u.display_name,usageKey:u.usage_key})))||[]};if(t.url){s?s(t.url):window.location.href=t.url;return}Vr(d,i,s)==="#"&&(s?s(`/search-result/${t.id}`):window.location.href=`/search-result/${t.id}`)},y=o=>{var b;o.preventDefault(),o.stopPropagation();const d={id:t.id,blockType:t.block_type||t.type,contextKey:t.context_key,usageKey:t.usage_key,breadcrumbs:((b=t.breadcrumbs)==null?void 0:b.map(u=>({displayName:u.display_name,usageKey:u.usage_key})))||[]},f=ir(d,i);f&&f!=="#"&&window.open(f,"_blank")},m=((g=t._formatted)==null?void 0:g.display_name)||t.display_name,j=((c=t._formatted)==null?void 0:c.description)||t.description,p=t.block_type||t.type;return r.jsx("div",{className:"search-result-item",onClick:n,role:"button",tabIndex:0,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&n(o)},children:r.jsxs("div",{className:"search-result-content",children:[r.jsx("div",{className:"search-result-icon",children:r.jsx(v.Icon,{src:Wr(p)})}),r.jsxs("div",{className:"search-result-text",children:[r.jsx("div",{className:"search-result-title",children:r.jsx(Qe,{text:m})}),j&&r.jsx("div",{className:"search-result-description",children:r.jsx(Qe,{text:j})}),t.breadcrumbs&&t.breadcrumbs.length>0&&r.jsx("div",{className:"search-result-breadcrumbs",children:t.breadcrumbs.map(o=>o.display_name).join(" / ")})]}),r.jsx("div",{className:"search-result-actions",children:r.jsx(v.IconButton,{src:Ir,iconAs:v.Icon,onClick:y,alt:"Open in new window",size:"sm"})})]})})},er=new zr,Fr=({logoUrl:t,menuList:s,loginSignupButtons:i,authenticatedUser:n=null,userMenuItems:y,menuAlignment:m,onLanguageChange:j,getBaseUrl:p,meiliSearchConfig:g,headerButtons:c,languageSelectorList:o})=>{const d=Tr(),{toggleSidebar:f,setSidebarCollapsed:b}=Te(),[u,I]=w.useState(()=>er.get("openedx-language-preference")||"en"),[U,S]=w.useState(!1),[D,O]=w.useState(!1),[G,$]=w.useState(!1),[X,H]=w.useState(""),[R,Z]=w.useState([]),[ee,z]=w.useState(!1),[L,W]=w.useState(null),[A,q]=w.useState(0),[C,F]=w.useState(!1),[K,Q]=w.useState(5),oe=w.useRef(null),J=w.useRef(null),ne=w.useRef(g?nr(g):null);console.log("languageSelectorList",o),w.useEffect(()=>{g!=null&&g.client&&ne.current&&ne.current.updateHeadersFromClient(g.client)},[g==null?void 0:g.client]),w.useEffect(()=>()=>{J.current&&clearTimeout(J.current)},[]),w.useEffect(()=>{document.body.dir=u==="ar"?"rtl":"ltr"},[u]),w.useEffect(()=>{d&&b(!0)},[d,b]),w.useEffect(()=>{if(!D)return;function h(N){oe.current&&!oe.current.contains(N.target)&&O(!1)}return document.addEventListener("mousedown",h),()=>{document.removeEventListener("mousedown",h)}},[D]);const ie=h=>{I(h),er.set("openedx-language-preference",h,{path:p?p():"/"}),j&&j()},je=m&&{left:"justify-content-start",center:"justify-content-center",right:"justify-content-end"}[m.toLowerCase()]||"justify-content-start",ce=async h=>{if(!h.trim()||!g||!ne.current){Z([]),q(0),$(!1),F(!1);return}z(!0),W(null),$(!1),Q(5);try{const N=await ne.current.simpleSearch(h,{limit:20,offset:0});Z(N.hits),q(N.totalHits),$(N.totalHits===0),F(!0)}catch(N){W(N instanceof Error?N.message:"Search failed"),$(!0),Z([]),q(0)}finally{z(!1)}},le=h=>{H(h),ce(h),d&&U&&S(!1)},se=h=>{H(h),G&&h.trim()===""&&($(!1),F(!1)),J.current&&clearTimeout(J.current),h.trim().length>0?J.current=setTimeout(()=>{ce(h)},500):(Z([]),q(0),$(!1),F(!1))},ue=()=>{J.current&&(clearTimeout(J.current),J.current=null),H(""),Z([]),q(0),$(!1),F(!1),W(null),z(!1)},ae=()=>{H(""),Z([]),q(0),$(!1),F(!1),W(null),z(!1),Q(5),J.current&&(clearTimeout(J.current),J.current=null)},xe=()=>{Q(h=>Math.min(h+10,R.length))},me=h=>{if(o&&o.length>0){const B=o.find(de=>de[h]);if(B)return B[h]}return{en:"English",ar:"Arabic",hi:"Hindi"}[h]||h.toUpperCase()},ge=()=>(console.log("renderLanguageOptions - languageSelectorList:",o),console.log("renderLanguageOptions - length:",o==null?void 0:o.length),o&&o.length>0?(console.log("Using custom languageSelectorList"),o.map((h,N)=>{const[B,de]=Object.entries(h)[0];return r.jsx(v.Dropdown.Item,{onClick:()=>ie(B),children:de},`lang-${B}-${N}`)})):(console.log("Using fallback languages"),r.jsxs(r.Fragment,{children:[r.jsx(v.Dropdown.Item,{onClick:()=>ie("en"),children:"English"}),r.jsx(v.Dropdown.Item,{onClick:()=>ie("ar"),children:"Arabic"}),r.jsx(v.Dropdown.Item,{onClick:()=>ie("hi"),children:"Hindi"})]})));return r.jsxs(v.Navbar,{expand:"lg",className:"navbarContainer py-1",children:[r.jsxs("div",{className:"d-flex align-items-center",children:[r.jsx("div",{className:"toggle-sidebar-icon",children:r.jsx(v.IconButton,{src:Nr,iconAs:v.Icon,alt:"Toggle Sidebar",onClick:f,className:"ms-2 ml-2",onMouseDown:h=>h.stopPropagation()})}),r.jsx(v.Navbar.Brand,{href:"/",className:"navbar-brand",children:r.jsx("img",{src:t,alt:"Logo"})})]}),n!==null&&r.jsx(r.Fragment,{children:d?r.jsx("div",{className:"d-flex justify-content-between align-items-center ml-auto",children:r.jsxs("div",{className:"d-flex align-items-center navbar-buttons",children:[g&&r.jsx(v.IconButton,{src:Mr,iconAs:v.Icon,alt:"Search",onClick:()=>S(!0)}),r.jsx("div",{className:"ml-2 usermenu-dropdown-mobile",children:r.jsx(Xe,{username:n==null?void 0:n.username,authenticatedUserAvatar:n==null?void 0:n.avatar,isMobile:d,isAdmin:n==null?void 0:n.administrator,menuItems:y})}),r.jsx(v.IconButton,{src:Pr,iconAs:v.Icon,alt:"More",onMouseDown:h=>h.stopPropagation(),onClick:()=>O(h=>!h)}),D&&r.jsxs("div",{className:"more-menu-dropdown",ref:oe,children:[r.jsxs("div",{className:"more-menu-icons-row",children:[(c==null?void 0:c.reSync)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ge,iconAs:v.Icon,alt:"Sync",tooltipPlacement:"bottom",tooltipContent:"Re-Sync"})}),(c==null?void 0:c.contextSwitcher)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ye,iconAs:v.Icon,alt:"Sync",tooltipPlacement:"bottom",tooltipContent:"Switch to User Mode"})}),(c==null?void 0:c.help)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Je,iconAs:v.Icon,alt:"Help",tooltipPlacement:"bottom",tooltipContent:"Help"})}),(c==null?void 0:c.notification)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ue,iconAs:v.Icon,alt:"Notifications",tooltipPlacement:"bottom",tooltipContent:"Notifications"})})]}),(c==null?void 0:c.translation)&&r.jsxs(v.Dropdown,{className:"language-dropdown",children:[r.jsx(v.Dropdown.Toggle,{variant:"tertiary",id:"language-dropdown",children:me(u)}),r.jsx(v.Dropdown.Menu,{children:ge()})]})]})]})}):r.jsxs(r.Fragment,{children:[g&&r.jsx("div",{className:"d-flex align-items-center justify-content-start flex-grow-1 ml-4",children:r.jsxs("div",{style:{width:"30rem",position:"relative"},children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",border:"2px solid #ccc",borderRadius:"25px",padding:"8px 16px",background:"#fff",position:"relative"},children:[r.jsx("input",{type:"text",value:X,onChange:h=>{se(h.target.value)},onKeyDown:h=>{h.key==="Enter"&&le(X)},placeholder:"Search",style:{flex:1,border:"none",outline:"none",fontSize:"16px",background:"transparent",padding:"4px"},autoComplete:"off"}),X&&r.jsx("button",{type:"button",onClick:()=>{ue()},style:{background:"none",border:"none",cursor:"pointer",padding:"4px",marginRight:"8px"},children:"✕"})]}),ee&&r.jsxs("div",{className:"search-loading-spinner-container",children:[r.jsx("div",{className:"search-loading-spinner"}),r.jsx("span",{children:"Searching..."})]}),G&&!ee&&r.jsx("div",{className:"no-results-message-desktop",children:r.jsx("p",{children:"We didn't find anything matching your search"})}),L&&r.jsx("div",{className:"search-error-message-desktop",children:r.jsxs("p",{children:["Search error: ",L]})}),C&&R.length>0&&r.jsxs("div",{className:"search-results-dropdown",children:[r.jsx("div",{className:"search-results-header",children:r.jsxs("span",{children:[A," result",A!==1?"s":""," found"]})}),r.jsxs("div",{className:"search-results-list",children:[R.slice(0,K).map((h,N)=>r.jsx(Be,{result:h,onNavigate:B=>{ae(),window.location.href=B},baseUrl:p?p():void 0},h.id||N)),K<R.length&&r.jsx("div",{className:"search-results-more",children:r.jsxs("button",{onClick:xe,style:{background:"none",border:"none",color:"#007bff",cursor:"pointer",padding:"8px 16px",width:"100%",textAlign:"center",fontSize:"14px"},children:["Show ",Math.min(10,R.length-K)," more results"]})})]})]})]})}),r.jsxs("div",{className:"d-flex align-items-center gap-2 ms-auto order-lg-3",children:[(c==null?void 0:c.reSync)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ge,iconAs:v.Icon,alt:"Sync",tooltipPlacement:"bottom",tooltipContent:"Re-Sync"})}),(c==null?void 0:c.contextSwitcher)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ye,iconAs:v.Icon,alt:"Sync",tooltipPlacement:"bottom",tooltipContent:"Switch to User Mode"})}),(c==null?void 0:c.help)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Je,iconAs:v.Icon,alt:"Help",tooltipPlacement:"bottom",tooltipContent:"Help"})}),(c==null?void 0:c.notification)&&r.jsx("div",{className:"icon-curved-square",children:r.jsx(v.IconButtonWithTooltip,{src:Ue,iconAs:v.Icon,alt:"Notifications",tooltipPlacement:"bottom",tooltipContent:"Notifications"})}),(c==null?void 0:c.translation)&&r.jsxs(v.Dropdown,{className:"language-dropdown",children:[r.jsx(v.Dropdown.Toggle,{variant:"tertiary",id:"language-dropdown",children:me(u)}),r.jsx(v.Dropdown.Menu,{children:ge()})]}),r.jsx("div",{className:"usermenu-dropdown",children:r.jsx(Xe,{username:n==null?void 0:n.username,authenticatedUserAvatar:n==null?void 0:n.avatar,isMobile:d,isAdmin:n==null?void 0:n.administrator,menuItems:y})})]})]})}),n===null&&r.jsxs(r.Fragment,{children:[r.jsx(v.Navbar.Toggle,{"aria-controls":"main-navbar-nav"}),r.jsx("div",{className:"d-flex align-items-center gap-2 ms-auto order-lg-3",children:i&&r.jsxs(r.Fragment,{children:[r.jsx(v.Button,{variant:"primary",children:"Log In"}),r.jsx(v.Button,{variant:"outline-primary",children:"Sign Up"})]})})]}),r.jsx(v.Navbar.Collapse,{id:"main-navbar-nav",className:"justify-content-between",children:r.jsx(v.Nav,{className:`nav-gap gap-3 flex-grow-1 ${je}`,children:n===null&&s.map(h=>h.subMenu?r.jsx(v.NavDropdown,{title:h.label,id:`nav-dropdown-${h.label}`,children:h.subMenu.map(N=>r.jsx(v.NavDropdown.Item,{onClick:()=>console.log("Selected submenu:",N.label),children:N.label},`sub-${N.label}`))},`menu-${h.label}`):r.jsx(v.Nav.Link,{as:"span",className:"text-uppercase fw-semibold",children:h.label},`menu-${h.label}`))})}),g&&U&&r.jsxs("div",{className:"fixed-search-bar",children:[r.jsxs("div",{className:"fixed-search-bar-inner",children:[r.jsxs("div",{style:{display:"flex",alignItems:"center",border:"2px solid #ccc",borderRadius:"25px",padding:"12px 16px",background:"#fff",position:"relative",width:"100%"},children:[r.jsx("input",{type:"text",value:X,onChange:h=>{se(h.target.value)},onKeyDown:h=>{h.key==="Enter"&&le(X)},placeholder:"Search",style:{flex:1,border:"none",outline:"none",fontSize:"18px",background:"transparent",padding:"4px"},autoComplete:"off",autoFocus:!0}),X&&r.jsx("button",{type:"button",onClick:()=>{ue()},style:{background:"none",border:"none",cursor:"pointer",padding:"4px",marginRight:"8px",fontSize:"18px"},children:"✕"})]}),r.jsx("button",{className:"close-search-bar",type:"button",onClick:()=>S(!1),"aria-label":"Close Search",children:"×"})]}),ee&&r.jsxs("div",{className:"search-loading-spinner-container",children:[r.jsx("div",{className:"search-loading-spinner"}),r.jsx("span",{children:"Searching..."})]}),G&&!ee&&r.jsx("div",{className:"no-results-message",children:r.jsx("p",{children:"We didn't find anything matching your search"})}),L&&r.jsx("div",{className:"search-error-message",children:r.jsxs("p",{children:["Search error: ",L]})}),C&&R.length>0&&r.jsxs("div",{className:"search-results-mobile",children:[r.jsx("div",{className:"search-results-header",children:r.jsxs("span",{children:[A," result",A!==1?"s":""," found"]})}),r.jsxs("div",{className:"search-results-list",children:[R.slice(0,K).map((h,N)=>r.jsx(Be,{result:h,onNavigate:B=>{ae(),window.location.href=B},baseUrl:p?p():void 0},h.id||N)),K<R.length&&r.jsx("div",{className:"search-results-more",children:r.jsxs("button",{onClick:xe,style:{background:"none",border:"none",color:"#007bff",cursor:"pointer",padding:"12px 16px",width:"100%",textAlign:"center",fontSize:"16px"},children:["Show ",Math.min(10,R.length-K)," more results"]})})]})]})]})]})},sr=w.createContext(void 0),Kr=({children:t,meiliSearchConfig:s})=>{const[i,n]=w.useState(""),[y,m]=w.useState([]),[j,p]=w.useState(0),[g,c]=w.useState(!1),[o,d]=w.useState(!1),[f,b]=w.useState(null),[u,I]=w.useState(0),[U,S]=w.useState(!1),[D,O]=w.useState(!1),[G,$]=w.useState(null),X=nr(s),H=async z=>{if(!z.trim()){Z();return}c(!0),d(!1),b(null),I(0);try{const L=await X.search(z,{limit:20,offset:0}),W=L.hits.map(C=>{var F,K,Q;return{id:C.id,title:((F=C._formatted)==null?void 0:F.display_name)||C.display_name,type:C.type,url:C.url,description:((K=C._formatted)==null?void 0:K.description)||C.description,block_type:C.block_type,published:((Q=C._formatted)==null?void 0:Q.published)||C.published,_formatted:C._formatted}}),A=L.totalHits,q=W.length===20&&A>W.length;m(W),p(A),S(q),$(L.facets||null)}catch(L){console.error("Search error:",L),d(!0),b(L instanceof Error?L.message:"Search failed"),m([]),p(0),S(!1),$(null)}finally{c(!1)}},R=async()=>{if(!(!U||D)){O(!0);try{const z=u+20,L=await X.simpleSearch(i,{limit:20,offset:z}),W=L.hits.map(C=>{var F,K,Q;return{id:C.id,title:((F=C._formatted)==null?void 0:F.display_name)||C.display_name,type:C.type,url:C.url,description:((K=C._formatted)==null?void 0:K.description)||C.description,block_type:C.block_type,published:((Q=C._formatted)==null?void 0:Q.published)||C.published,_formatted:C._formatted}}),A=L.totalHits,q=W.length===20&&A>y.length+W.length;m(C=>[...C,...W]),p(A),S(q),I(z)}catch(z){console.error("Error fetching next page:",z),d(!0),b(z instanceof Error?z.message:"Failed to load more results")}finally{O(!1)}}},Z=()=>{n(""),m([]),p(0),d(!1),b(null),I(0),S(!1),$(null)},ee={searchKeywords:i,setSearchKeywords:n,searchResults:y,totalHits:j,isLoading:g,hasError:o,errorMessage:f,facets:G,performSearch:H,clearSearch:Z,hasNextPage:U,fetchNextPage:R,isFetchingNextPage:D};return r.jsx(sr.Provider,{value:ee,children:t})},Yr=()=>{const t=w.useContext(sr);if(t===void 0)throw new Error("useSimpleSearch must be used within a SimpleSearchProvider");return t};exports.Footer=Or;exports.MainHeader=Fr;exports.Sidebar=kr;exports.SidebarProvider=Rr;exports.SimpleSearchProvider=Kr;exports.useSidebar=Te;exports.useSimpleSearch=Yr;
package/dist/index.css ADDED
@@ -0,0 +1 @@
1
+ .footer{background-color:#000;padding:1rem 2rem;color:#fff}.container{display:flex;justify-content:space-between;flex-wrap:wrap;height:15rem}.section{flex:1;margin:1rem;min-width:12.5rem;display:flex;flex-direction:column;text-align:left}.section .footer-brand-logo{padding:0;display:flex;align-items:center;margin-bottom:.5rem}.section .footer-brand-logo img{max-width:100%;height:auto;object-fit:contain;max-height:5rem}.left{order:1;align-items:flex-start}.center{order:2;align-items:center}.right{order:3;align-items:flex-end}.section h3{color:#fff;margin-bottom:1rem}.section ul{list-style:none;padding:0}.section ul li{margin-bottom:.625rem}.section ul li a{color:#fff;text-decoration:none}.section ul li a:hover{text-decoration:underline}.copyright{text-align:center;margin-top:1.25rem;font-size:.875rem;color:#737477}.h3Adjust{margin-left:-1.5rem}.sidebar{width:200px;min-height:100vh;background-color:var(--bg-surface);border-right:1px solid var(--border-color);position:relative;transition:all .3s ease;display:flex;flex-direction:column;padding:0;z-index:101;transition:width .3s cubic-bezier(.4,0,.2,1);overflow:visible}.sidebar.collapsed{width:80px;min-width:50px;padding:0;transition:width .3s cubic-bezier(.4,0,.2,1)}.sidebar.collapsed .sidebar-btn{padding:14px 0 14px 10px;justify-content:center;position:relative;z-index:25}.sidebar.collapsed .sidebar-btn .btn-content{flex-direction:column;align-items:center;gap:0}.sidebar.collapsed .sidebar-btn .btn-content .btn-label{display:none;opacity:0;max-width:0;margin-left:0}.sidebar.non-standard-route:not(.collapsed){width:200px;position:fixed;top:6rem;left:0;z-index:1000;transition:transform .3s cubic-bezier(.4,0,.2,1),box-shadow .3s ease;transform:translate(0);margin-right:80px}.sidebar .sidebar-buttons{display:flex;flex-direction:column;gap:4px;margin-top:1.5rem;margin-right:1rem}.sidebar .sidebar-btn{display:flex;align-items:center;justify-content:flex-start;width:100%;padding:14px 10px;border-radius:0 32px 32px 0;background:transparent;color:var(--text-secondary);font-weight:500;font-size:16px;border:none;transition:background .2s,color .2s;margin:2px 0;text-align:left}.sidebar .sidebar-btn .btn-content{display:flex;flex-direction:row;align-items:center;width:100%}.sidebar .sidebar-btn .icon-container{font-size:22px;display:flex;align-items:center;justify-content:center;min-width:28px}.sidebar .sidebar-btn .btn-label{font-size:14px;font-weight:500;color:inherit;white-space:nowrap;transition:opacity .2s,max-width .2s,margin .2s;opacity:1;max-width:200px;margin-left:.5rem}.pgn-btn-active{background:var(--primary)!important;color:var(--text-white)!important}.pgn-btn-active:hover{background-color:var(--primary-light)!important;color:var(--primary)!important}.pgn-btn-active:hover .icon-container,.pgn-btn-active:hover .btn-label{color:var(--primary)!important}.pgn-btn-active .icon-container,.pgn-btn-active .btn-label{color:var(--text-white)!important}.sidebar-btn.pgn-btn-inactive{color:var(--text-secondary)!important}.sidebar-btn.pgn-btn-inactive:hover{color:var(--primary)!important}.sidebar-extra-space{width:80px}[dir=rtl] .sidebar .tooltip.bs-tooltip-left{margin-right:8px}[dir=rtl] .sidebar.collapsed .tooltip.bs-tooltip-left{transform:translate(-4px)}.mainHeaderContainer{display:flex}.navbarContainer{background-color:var(--bg-surface);box-shadow:0 2px 4px #0000001a;height:6rem;position:relative;display:flex;align-items:center;padding-right:3rem}.navbarContainer .navbar-brand{padding:0;display:flex;align-items:center;margin:0}.navbarContainer .navbar-brand img{max-width:100%;height:auto;object-fit:contain;max-height:5rem;padding-top:.5rem;padding-bottom:.5rem}.navbarContainer .navbar-collapse{background-color:var(--c8);border-radius:0 0 .5rem .5rem;padding:1rem}.navbarContainer .d-flex.align-items-center.justify-content-center{position:absolute;left:50%;transform:translate(-50%);width:auto;z-index:1}.navbarContainer .toggle-sidebar-icon{display:flex;align-items:center;margin:0;margin-right:1rem}.navbarContainer .search-field-custom{max-width:30rem}@media (max-width: 767px){.navbarContainer{padding-right:.25rem;display:flex;align-items:center;gap:.25rem;height:5rem;justify-content:flex-start}.navbarContainer .navbar-brand img{max-width:5rem;height:auto;object-fit:contain;max-height:5rem;padding-top:.2rem;padding-bottom:.2rem}.navbarContainer .toggle-sidebar-icon{margin:0;padding:0}.navbarContainer .more-menu-dropdown{position:absolute;top:100%;right:1rem;background-color:var(--bg-surface);border-radius:.5rem;box-shadow:0 2px 8px #00000026;padding:1rem;z-index:1000;display:flex;flex-direction:column;min-width:200px}.navbarContainer .more-menu-dropdown .more-menu-icons-row{display:flex;flex-direction:row;gap:.5rem;width:100%;margin-bottom:.5rem}.navbarContainer .more-menu-dropdown .more-menu-icons-row .icon-curved-square{flex:1;display:flex}.navbarContainer .more-menu-dropdown .more-menu-icons-row .icon-curved-square .btn-icon{width:100%;height:100%;padding:.5rem;display:flex;align-items:center;justify-content:center}.navbarContainer .more-menu-dropdown .language-dropdown{width:100%;margin-top:.5rem;margin-bottom:.5rem}.navbarContainer .toggle-sidebar-icon{margin-left:0;padding-left:0}}.buttonListContainer{display:grid;grid-template-columns:1fr auto;align-items:center;flex:1}.navbarList{display:flex;gap:2rem;padding:0;margin:0;list-style-type:none}.navbarList li{cursor:pointer;color:var(--c6)}.navbarList li:hover{color:var(--c2)}.navbarButtons{display:flex;gap:.5rem;margin-left:auto}.navbarListLeft{justify-self:start;margin-left:4rem}.navbarListCenter{justify-self:center}.navbarListRight{justify-self:end;margin-right:4rem}.menuButton{padding:.75rem 1.25rem;font-weight:600;text-transform:uppercase;color:var(--c6);background-color:var(--bg-surface);outline:none!important;border-color:var(--bg-surface)!important;width:8rem}.mainHeaderContainer{display:flex;position:relative}.nav-gap{gap:3rem}.dropdown-menu{min-width:15rem!important}.search-field-custom{background:var(--bg-surface);border:2px solid var(--primary-light)!important;border-radius:30px!important;padding:.3rem .6rem!important;display:flex;align-items:center;box-shadow:none!important;min-height:35px;position:relative;pointer-events:auto!important}.search-field-custom input{background:transparent!important;border:none!important;box-shadow:none!important;color:var(--text-light)!important;font-size:1.1rem;font-weight:500;pointer-events:auto!important;-webkit-user-select:text!important;user-select:text!important}.search-field-custom input::placeholder{color:var(--text-secondary, #697586)!important;opacity:1}.search-field-custom .pgn__searchfield-form{outline:none!important;border:none!important}.search-field-custom input:focus{outline:none!important;box-shadow:none!important}.pgn__searchfield.has-focus:not(.pgn__searchfield--external):after{border:none!important}.pgn__searchfield:hover,.pgn__searchfield:active{border:2px solid var(--primary)!important}.icon-curved-square .btn-icon.btn-icon-primary{background-color:var(--primary-light)!important;margin-right:1rem}.icon-curved-square .btn-icon.btn-icon-primary:hover,.icon-curved-square .btn-icon.btn-icon-primary:active{background-color:var(--primary)!important;color:var(--primary-light)!important}.icon-curved-square .btn-icon.btn-icon-primary:focus{background-color:var(--primary-light);color:var(--primary)}.icon-curved-square .btn-icon.btn-icon-primary:focus:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.language-dropdown .btn-tertiary{background-color:var(--primary-light);border-radius:25px}.language-dropdown .btn-tertiary:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.language-dropdown .btn-tertiary.dropdown-toggle{background-color:var(--primary-light)!important;color:var(--primary)!important}.language-dropdown .btn-tertiary.dropdown-toggle:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.usermenu-dropdown{margin-left:1rem}.usermenu-dropdown .btn-tertiary{border-radius:10px}.toggle-sidebar-icon .btn-icon.btn-icon-primary{background-color:var(--primary-light)}.toggle-sidebar-icon .btn-icon.btn-icon-primary:hover{background-color:var(--primary);color:var(--primary-light)!important}.toggle-sidebar-icon .btn-icon.btn-icon-primary:active{background-color:var(--primary)!important;color:var(--primary-light)!important}.toggle-sidebar-icon .btn-icon.btn-icon-primary:focus{background-color:var(--primary-light);color:var(--primary)}.toggle-sidebar-icon .btn-icon.btn-icon-primary:focus:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.search-modal .modal-content{border-radius:.5rem}.search-modal .modal-header{border-bottom:none;padding:1rem 1.5rem}.search-modal .modal-body{padding:0 1.5rem 1.5rem}.fixed-search-bar{position:fixed;top:0;left:0;width:100vw;z-index:2000;background:#fffffffa;box-shadow:0 2px 8px #0000001a;padding:1rem .5rem;display:flex;justify-content:center;align-items:center}.fixed-search-bar-inner{width:100%;max-width:600px;position:relative;display:flex;align-items:center}.fixed-search-bar .close-search-bar{background:none;border:none;font-size:2rem;color:var(--text-muted);margin-left:.5rem;cursor:pointer;line-height:1;transition:color .2s}.fixed-search-bar .close-search-bar:hover{color:var(--text-primary)}.no-results-message{text-align:center;padding:1rem;margin-top:1rem;color:var(--text-muted);font-size:1rem;background-color:var(--bg-surface);border-radius:.5rem;border:1px solid var(--border-color)}.no-results-message p{margin:0;font-weight:400}.no-results-message-desktop{position:absolute;top:100%;left:0;right:0;z-index:1000;background-color:var(--bg-surface);border:1px solid var(--border-color);border-radius:.5rem;box-shadow:0 2px 8px #0000001a;padding:1rem;margin-top:.5rem;text-align:center;color:var(--text-muted);font-size:.9rem}.no-results-message-desktop p{margin:0;font-weight:400}.search-loading-spinner{display:inline-block;width:16px;height:16px;border:2px solid var(--border-color);border-top:2px solid var(--primary);border-radius:50%;animation:spin 1s linear infinite;margin-right:8px}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.search-loading-spinner-container{position:absolute;top:100%;left:0;right:0;z-index:1000;background-color:var(--bg-surface);border:1px solid var(--border-color);border-radius:.5rem;box-shadow:0 2px 8px #0000001a;padding:1rem;margin-top:.5rem;display:flex;align-items:center;justify-content:center;color:var(--text-muted);font-size:.9rem}.search-error-message-desktop{position:absolute;top:100%;left:0;right:0;z-index:1000;background-color:var(--bg-surface);border:1px solid var(--danger);border-radius:.5rem;box-shadow:0 2px 8px #0000001a;padding:1rem;margin-top:.5rem;text-align:center;color:var(--danger);font-size:.9rem}.search-error-message-desktop p{margin:0;font-weight:400}.search-results-dropdown{position:absolute;top:100%;left:0;right:0;z-index:1000;background-color:var(--bg-surface);border:1px solid var(--border-color);border-radius:.5rem;box-shadow:0 4px 12px #00000026;margin-top:.5rem;max-height:400px;overflow-y:auto}.search-results-dropdown .search-results-header{padding:.75rem 1rem;border-bottom:1px solid var(--border-color);background-color:var(--bg-body);font-size:.875rem;font-weight:600;color:var(--text-muted)}.search-results-dropdown .search-results-list{max-height:300px;overflow-y:auto}.search-results-dropdown .search-result-item{padding:.75rem 1rem;border-bottom:1px solid var(--border-color);cursor:pointer;transition:background-color .2s}.search-results-dropdown .search-result-item:hover{background-color:var(--bg-hover)}.search-results-dropdown .search-result-item:last-child{border-bottom:none}.search-results-dropdown .search-result-item .search-result-content{display:flex;align-items:flex-start;gap:.75rem}.search-results-dropdown .search-result-item .search-result-icon{flex-shrink:0;margin-top:.125rem;color:var(--text-muted)}.search-results-dropdown .search-result-item .search-result-text{flex:1;min-width:0}.search-results-dropdown .search-result-item .search-result-title{font-weight:600;color:var(--text-primary);margin-bottom:.25rem;font-size:.9rem;line-height:1.3}.search-results-dropdown .search-result-item .search-result-description{color:var(--text-muted);font-size:.8rem;line-height:1.4;margin-bottom:.5rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.search-results-dropdown .search-result-item .search-result-breadcrumbs{color:var(--text-muted);font-size:.75rem;line-height:1.2;margin-top:.25rem}.search-results-dropdown .search-result-item .search-result-actions{flex-shrink:0;margin-top:.125rem}.search-results-dropdown .search-result-item .search-result-meta{display:flex;align-items:center;gap:.5rem}.search-results-dropdown .search-result-item .search-result-meta .search-result-type{background-color:var(--bg-surface);color:var(--text-muted);padding:.125rem .5rem;border-radius:.25rem;font-size:.75rem;font-weight:500;text-transform:uppercase}.search-results-dropdown .search-highlight{background-color:var(--bg-hover);padding:.125rem .25rem;border-radius:.25rem;font-weight:600}.search-results-dropdown .search-results-more{padding:0;text-align:center;background-color:var(--bg-body);border-top:1px solid var(--border-color)}.search-results-dropdown .search-results-more button{background:none;border:none;color:var(--primary);cursor:pointer;padding:8px 16px;width:100%;text-align:center;font-size:14px;transition:background-color .2s}.search-results-dropdown .search-results-more button:hover{background-color:var(--bg-hover)}.search-results-mobile{margin-top:1rem;background-color:var(--bg-surface);border-radius:.5rem;box-shadow:0 2px 8px #0000001a;max-height:60vh;overflow-y:auto}.search-results-mobile .search-results-header{padding:.75rem 1rem;border-bottom:1px solid var(--border-color);background-color:var(--bg-body);font-size:.875rem;font-weight:600;color:var(--text-muted)}.search-results-mobile .search-results-list{max-height:50vh;overflow-y:auto}.search-results-mobile .search-result-item{padding:1rem;border-bottom:1px solid var(--border-color);cursor:pointer;transition:background-color .2s}.search-results-mobile .search-result-item:hover{background-color:var(--bg-hover)}.search-results-mobile .search-result-item:last-child{border-bottom:none}.search-results-mobile .search-result-item .search-result-content{display:flex;align-items:flex-start;gap:1rem}.search-results-mobile .search-result-item .search-result-icon{flex-shrink:0;margin-top:.25rem;color:var(--text-muted)}.search-results-mobile .search-result-item .search-result-text{flex:1;min-width:0}.search-results-mobile .search-result-item .search-result-title{font-weight:600;color:var(--text-primary);margin-bottom:.5rem;font-size:1rem;line-height:1.3}.search-results-mobile .search-result-item .search-result-description{color:var(--text-muted);font-size:.875rem;line-height:1.4;margin-bottom:.75rem;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.search-results-mobile .search-result-item .search-result-breadcrumbs{color:var(--text-muted);font-size:.8rem;line-height:1.2;margin-top:.5rem}.search-results-mobile .search-result-item .search-result-actions{flex-shrink:0;margin-top:.25rem}.search-results-mobile .search-result-item .search-result-meta{display:flex;align-items:center;gap:.5rem}.search-results-mobile .search-result-item .search-result-meta .search-result-type{background-color:var(--bg-hover);color:var(--text-secondary);padding:.25rem .75rem;border-radius:.375rem;font-size:.75rem;font-weight:500;text-transform:uppercase}.search-error-message{margin-top:1rem;padding:1rem;background-color:var(--bg-disabled);border:1px solid var(--danger);border-radius:.5rem;color:var(--danger);text-align:center}.search-error-message p{margin:0;font-weight:400}.navbar-buttons .btn-icon.btn-icon-primary{background-color:var(--primary-light)}.navbar-buttons .btn-icon.btn-icon-primary:hover{background-color:var(--primary);color:var(--primary-light)!important}.navbar-buttons .btn-icon.btn-icon-primary:active{background-color:var(--primary)!important;color:var(--primary-light)!important}.navbar-buttons .btn-icon.btn-icon-primary:focus{background-color:var(--primary-light);color:var(--primary)}.navbar-buttons .btn-icon.btn-icon-primary:focus:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.usermenu-dropdown-mobile .btn-tertiary{background-color:var(--primary-light);border-radius:25px}.usermenu-dropdown-mobile .btn-tertiary:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}.usermenu-dropdown-mobile .btn-tertiary.dropdown-toggle{background-color:var(--primary-light)!important;color:var(--primary)!important}.usermenu-dropdown-mobile .btn-tertiary.dropdown-toggle:hover{background-color:var(--primary)!important;color:var(--primary-light)!important}:root{--primary: #2B2399;--primary-alt: #3C32B5;--primary-hover: #E2E1F9;--primary-active: #1F1A7D;--primary-light: #E2E1F9;--secondary: #7A8AFF;--secondary-alt: #5C6EF0;--secondary-hover: #ECEEFF;--secondary-active: #4A5BD1;--secondary-light: #ECEEFF;--disabled: #bdbdbd;--success: #358F0A;--success-hover: #2d7908;--success-light: #eaf6e6;--warning: #FFCD29;--warning-hover: #e6b800;--warning-light: #fff8e6;--danger: #dc3545;--danger-hover: #c82333;--danger-light: #fbecec;--info: #0B8E77;--info-hover: #097a66;--info-light: #e6f5f2;--text-primary: #121926;--text-secondary: #9e9f9e;--text-muted: #6b7280;--text-light: #364152;--text-white: #ffffff;--bg-body: #f4f7ff;--bg-surface: #ffffff;--bg-hover: #f9fafb;--bg-disabled: #e5e7eb;--border-color: #e5e6e6;--border-color-hover: #d1d5db}.btn{border-radius:4px;font-weight:500;transition:all .2s ease-in-out}.btn-primary{color:var(--primary-light)!important;background-color:var(--primary)!important;border-color:var(--primary)!important;border-radius:8px!important}.btn-primary:hover{background-color:var(--primary-hover)!important;border-color:var(--primary-hover)!important;color:var(--primary-alt)!important}.btn-primary:active,.btn-primary.active{background-color:var(--primary-active)!important;border-color:var(--primary-active)!important;color:var(--primary-light)!important}.btn-primary:disabled{background-color:var(--disabled)!important;border-color:var(--disabled)!important;color:var(--primary-alt)!important}.btn-primary:focus:before{border:none!important}.btn-primary:focus-visible{outline:none!important}.btn-outline-primary{color:var(--primary)!important;border-color:var(--primary)!important;background-color:transparent!important;border-radius:8px!important}.btn-outline-primary:hover{color:var(--primary-light)!important;background-color:var(--primary)!important;border-color:var(--primary)!important}.btn-outline-primary:active,.btn-outline-primary.active{color:var(--primary-light)!important;background-color:var(--primary-active)!important;border-color:var(--primary-active)!important}.btn-outline-primary:disabled{color:var(--disabled)!important;border-color:var(--disabled)!important}.btn-outline-primary:focus:before{border:none!important}.btn-outline-primary:focus-visible{outline:none!important}.btn-secondary{color:var(--primary-light)!important;background-color:var(--secondary)!important;border-color:var(--secondary)!important;border-radius:8px!important}.btn-secondary:hover{background-color:var(--secondary-hover)!important;border-color:var(--secondary-hover)!important;color:var(--secondary-hover)!important}.btn-secondary:active,.btn-secondary.active{background-color:var(--secondary-active)!important;border-color:var(--secondary-active)!important}.btn-secondary:disabled{background-color:var(--disabled)!important;border-color:var(--disabled)!important;color:var(--primary-alt)!important}.btn-secondary:focus-visible{outline:none!important}.btn-outline-secondary{color:var(--secondary);border-color:var(--secondary);background-color:transparent;border-radius:8px}.btn-outline-secondary:hover{color:var(--primary-light);background-color:var(--secondary);border-color:var(--secondary)}.btn-outline-secondary:active,.btn-outline-secondary.active{color:var(--primary-light)!important;background-color:var(--secondary-active)!important;border-color:var(--secondary-active)!important}.btn-outline-secondary:disabled{color:var(--disabled)!important;border-color:var(--disabled)!important}.btn-outline-secondary:focus:before{border:none!important}.btn-outline-secondary:focus-visible{outline:none!important}.btn-tertiary{color:var(--primary)!important;background-color:transparent;border:none!important;border-radius:8px}.btn-tertiary:hover{color:var(--primary-light);background-color:var(--primary-light)!important}.btn-tertiary:active,.btn-tertiary.active{color:var(--primary-active)!important;background-color:var(--primary-light)!important}.btn-tertiary:disabled{color:var(--disabled)!important}.btn-tertiary:focus:before{border:none!important;border:solid 2px transparent}.btn-tertiary:focus-visible{outline:none!important}.btn-outline-tertiary{color:var(--primary)!important;background-color:transparent!important;border:none!important;border-radius:8px}.btn-outline-tertiary:hover{color:var(--primary-hover);background-color:var(--primary-light)}.btn-outline-tertiary:active,.btn-outline-tertiary.active{color:var(--primary-active)!important;background-color:var(--primary-light)!important}.btn-outline-tertiary:disabled{color:var(--disabled)!important}.btn-outline-tertiary:focus:before{border:none!important}.btn-outline-tertiary:focus-visible{outline:none!important}.dropdown-menu{border-radius:4px;border:1px solid rgba(0,0,0,.1);box-shadow:0 2px 4px #0000001a;padding:.5rem 0}.dropdown-item{color:#333;padding:.5rem 1rem}.dropdown-item:hover{background-color:var(--primary-light);color:var(--primary)}.dropdown-item:active,.dropdown-item.active{background-color:var(--primary);color:#fff}.dropdown-item:disabled{color:rgba(var(--secondary-rgb),.5)}.form-control{border-radius:8px;border:1px solid #ced4da}.form-control:focus{border-color:var(--primary);box-shadow:0 0 0 .2rem rgba(var(--primary-rgb),.25)}.form-control:disabled{background-color:#e9ecef}.badge{font-weight:500;padding:.35em .65em;border-radius:4px}.badge-primary{background-color:var(--primary)!important;color:#fff}.badge-secondary{background-color:var(--secondary);color:#fff}.alert{border-radius:4px;border:1px solid transparent}.alert-primary{background-color:var(--primary-light);border-color:var(--primary);color:var(--primary)}.pgn__bubble.pgn__bubble-primary{background-color:var(--primary);color:#fff}.pgn__data-table th{color:var(--secondary)}.pgn__data-table .pgn__data-table-cell-wrap{max-width:unset}.pgn__data-table .pgn__data-table-footer{border-top:none;justify-content:center}.card{border-radius:16px;box-shadow:none!important}.nav-link{color:var(--secondary)}.nav-link:hover{color:var(--primary)}.nav-link.active{color:var(--primary);font-weight:500}.nav-tabs .nav-link.active:focus:before,.nav-tabs .nav-link:focus:before,.nav-tabs .nav-link:focus-visible:before{border:none!important}.nav-tabs .nav-link{color:var(--text-primary)!important}.nav-tabs .nav-link.active{color:var(--primary)!important;border-bottom:2px solid var(--primary)!important}.pgn__modal .pgn__modal-header{padding:1.5rem;border-bottom:1px solid rgba(0,0,0,.1)}.pgn__modal .pgn__modal-header h2{color:var(--primary);font-size:1.375rem;line-height:1.75rem}.pgn__modal .pgn__modal-footer{padding:1rem 1.5rem;border-top:1px solid rgba(0,0,0,.1)}.pgn__form-group{margin-bottom:1rem}.pgn__form-group .pgn__form-label{font-weight:500;font-size:.875rem;color:var(--text-primary);margin-bottom:.5rem}.pgn__form-group .pgn__form-control-description{font-size:.75rem;color:var(--text-primary);margin-top:.25rem}.pgn__form-checkbox,.pgn__form-radio{margin:.5rem 0;display:flex;align-items:flex-start}.pgn__form-checkbox input,.pgn__form-radio input{margin-right:.5rem;margin-top:.25rem}.pgn__form-checkbox.pgn__form-control-disabled,.pgn__form-radio.pgn__form-control-disabled{opacity:.5;cursor:not-allowed}.pgn__form-checkbox-input,.pgn__form-radio-input{width:1rem;height:1rem}.pgn__form-checkbox-input:checked,.pgn__form-radio-input:checked{background-color:var(--primary);border-color:var(--primary)}.pgn__form-checkbox-input:focus,.pgn__form-radio-input:focus{box-shadow:0 0 0 .2rem rgba(var(--primary-rgb),.25);border-color:var(--primary)}.pgn__selectable_box{border:1px solid rgba(0,0,0,.1);border-radius:4px;padding:1rem;transition:all .2s ease-in-out;cursor:pointer}.pgn__selectable_box:hover,.pgn__selectable_box.pgn__selectable_box-active{border-color:var(--primary);background-color:var(--primary-light)}.pgn__selectable_box.pgn__selectable_box-invalid{border-color:var(--danger)}.pgn__selectable_box-set{display:grid;gap:1rem;margin:1rem 0}.btn-success{color:#fff;background-color:var(--success);border-color:var(--success)}.btn-success:hover{background-color:var(--success-hover);border-color:var(--success-hover)}.btn-success:active,.btn-success.active{background-color:var(--success-hover)!important;border-color:var(--success-hover)!important}.btn-success:disabled{opacity:.5}.btn-warning{color:#000;background-color:var(--warning);border-color:var(--warning)}.btn-warning:hover{background-color:var(--warning-hover);border-color:var(--warning-hover)}.btn-warning:active,.btn-warning.active{background-color:var(--warning-hover)!important;border-color:var(--warning-hover)!important}.btn-warning:disabled{opacity:.5}.btn-danger{color:#fff;background-color:var(--danger);border-color:var(--danger)}.btn-danger:hover{background-color:var(--danger-hover);border-color:var(--danger-hover)}.btn-danger:active,.btn-danger.active{background-color:var(--danger-hover)!important;border-color:var(--danger-hover)!important}.btn-danger:disabled{opacity:.5}.btn-info{color:#fff;background-color:var(--info);border-color:var(--info)}.btn-info:hover{background-color:var(--info-hover);border-color:var(--info-hover)}.btn-info:active,.btn-info.active{background-color:var(--info-hover)!important;border-color:var(--info-hover)!important}.btn-info:disabled{opacity:.5}.btn-icon:focus{color:var(--primary)!important}.btn-icon.btn-icon-primary{color:var(--primary)}.btn-icon.btn-icon-primary:hover{color:var(--primary-alt)!important;background-color:var(--primary-hover);border-color:var(--primary-hover)}.btn-icon.btn-icon-primary:active,.btn-icon.btn-icon-primary.active{color:var(--primary-light)!important;background-color:var(--primary-active)!important;border-color:var(--primary-active)!important}.btn-icon.btn-icon-primary:disabled{color:var(--disabled)!important}.btn-icon.btn-icon-primary:focus{box-shadow:none!important}.btn-icon.btn-icon-secondary{color:var(--secondary)}.btn-icon.btn-icon-secondary:hover{color:var(--secondary-alt)!important;background-color:var(--secondary-hover);border-color:var(--secondary-hover)}.btn-icon.btn-icon-secondary:active,.btn-icon.btn-icon-secondary.active{color:var(--secondary-light)!important;background-color:var(--secondary-active)!important;border-color:var(--secondary-active)!important}.btn-icon.btn-icon-secondary:disabled{color:var(--disabled)!important}.btn-icon.btn-icon-secondary:focus{box-shadow:none!important}.btn-icon.btn-outline-primary{color:var(--primary);border-color:var(--primary);background-color:transparent}.btn-icon.btn-outline-primary .pgn__icon{color:var(--primary)}.btn-icon.btn-outline-primary:hover{color:var(--primary-light);background-color:var(--primary);border-color:var(--primary)}.btn-icon.btn-outline-primary:hover .pgn__icon{color:var(--primary-light)}.btn-icon.btn-outline-primary:active,.btn-icon.btn-outline-primary.active{color:var(--primary-light)!important;background-color:var(--primary-active)!important;border-color:var(--primary-active)!important}.btn-icon.btn-outline-primary:active .pgn__icon,.btn-icon.btn-outline-primary.active .pgn__icon{color:var(--primary-light)!important}.btn-icon.btn-outline-primary:disabled{color:var(--disabled)!important;border-color:var(--disabled)!important}.btn-icon.btn-outline-primary:disabled .pgn__icon{color:var(--disabled)!important}.btn-icon.btn-outline-secondary{color:var(--secondary);border-color:var(--secondary);background-color:transparent}.btn-icon.btn-outline-secondary .pgn__icon{color:var(--secondary)}.btn-icon.btn-outline-secondary:hover{color:var(--primary-light);background-color:var(--secondary);border-color:var(--secondary)}.btn-icon.btn-outline-secondary:hover .pgn__icon{color:var(--primary-light)}.btn-icon.btn-outline-secondary:active,.btn-icon.btn-outline-secondary.active{color:var(--primary-light)!important;background-color:var(--secondary-active)!important;border-color:var(--secondary-active)!important}.btn-icon.btn-outline-secondary:active .pgn__icon,.btn-icon.btn-outline-secondary.active .pgn__icon{color:var(--primary-light)!important}.btn-icon.btn-outline-secondary:disabled{color:var(--disabled)!important;border-color:var(--disabled)!important}.btn-icon.btn-outline-secondary:disabled .pgn__icon{color:var(--disabled)!important}.btn-icon.btn-tertiary{color:var(--primary);background-color:transparent;border:none}.btn-icon.btn-tertiary .dropdown-toggle{background-color:var(--primary-light)!important}.btn-icon.btn-tertiary .pgn__icon{color:var(--primary)}.btn-icon.btn-tertiary:hover{color:var(--primary-hover);background-color:var(--primary-light)}.btn-icon.btn-tertiary:hover .pgn__icon{color:var(--primary-hover)}.btn-icon.btn-tertiary:active,.btn-icon.btn-tertiary.active{color:var(--primary-active)!important;background-color:var(--primary-light)!important}.btn-icon.btn-tertiary:active .pgn__icon,.btn-icon.btn-tertiary.active .pgn__icon{color:var(--primary-active)!important}.btn-icon.btn-tertiary:disabled{color:var(--disabled)!important}.btn-icon.btn-tertiary:disabled .pgn__icon{color:var(--disabled)!important}.text-primary{color:var(--text-primary)!important}.text-secondary{color:var(--text-secondary)!important}.text-success{color:var(--success)!important}.text-warning{color:var(--warning)!important}.text-danger{color:var(--danger)!important}.text-info{color:var(--info)!important}.pgn__icon.text-primary{color:var(--text-primary)!important}.pgn__icon.text-secondary{color:var(--text-secondary)!important}.pgn__icon.text-success{color:var(--success)!important}.pgn__icon.text-warning{color:var(--warning)!important}.pgn__icon.text-danger{color:var(--danger)!important}.pgn__icon.text-info{color:var(--info)!important}.cursor-pointer{cursor:pointer}.custom-outline-section .row{box-shadow:none!important;border:1px solid #e1e1e1}[data-tooltip]{position:relative;margin:0 5px;height:20px}[data-tooltip]:hover:after{content:attr(data-tooltip);position:absolute;left:50%;transform:translate(-50%);top:calc(100% + 8px);padding:8px 12px;background:var(--text-primary);color:var(--text-white);border-radius:6px;box-shadow:0 4px 8px #0003;white-space:normal;z-index:10;font-size:12px;line-height:1.4;max-width:250px;width:max-content;text-align:center}[data-tooltip]:hover:before{content:"";position:absolute;left:50%;transform:translate(-50%);top:100%;border:6px solid transparent;border-bottom-color:var(--text-primary);z-index:11}.ca-breadcrumb-bg{width:100%;padding:.5rem 0 0}.ca-breadcrumb-container{margin:0 auto;padding:0 32px}.ca-breadcrumb{color:#b0b7c3;font-size:14px;margin-bottom:8px}.ca-breadcrumb .ca-breadcrumb-icon{opacity:.7}.ca-breadcrumb .ca-breadcrumb-icon .custom-icon{width:16px;height:16px;margin-right:4px}.ca-breadcrumb .ca-breadcrumb-divider{margin:0 8px}.ca-breadcrumb .ca-breadcrumb-current{color:#6b7280}.ca-title{font-weight:600;font-size:20px;color:#22223b}.ca-main-layout{display:flex;min-height:100vh;align-items:flex-start}.ca-sidebar{min-width:220px;max-width:260px;background:transparent;z-index:2;border-radius:0!important;padding-bottom:0!important;box-sizing:border-box;margin:16px 0 0 16px;border-radius:16px;position:sticky;top:32px;align-self:flex-start;overflow-y:auto;overflow-x:hidden;height:calc(100vh - 32px);max-height:calc(100vh - 32px)}.ca-main-content{flex:1;padding-top:1rem}.ca-mobile-nav{display:none;width:100%;padding:16px;padding-left:1.5rem;padding-right:1.5rem;border-bottom:1px solid #eee}.ca-mobile-nav-select{width:100%;padding:12px 30px 12px 12px;font-size:1rem;border:1px solid #ccc;border-radius:8px;background-color:#fff;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url(data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%236c757d%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E);background-repeat:no-repeat;background-position:right 10px center;background-size:10px 10px}@media (max-width: 768px){.ca-sidebar{display:none}.ca-mobile-nav{display:block}.ca-main-layout{flex-direction:column}}
@@ -0,0 +1,8 @@
1
+ export { default as Footer } from './components/common/Footer/Footer';
2
+ export { SidebarProvider } from './providers/SidebarProvider';
3
+ export { useSidebar } from './hooks/useSidebar';
4
+ export { default as Sidebar } from './components/common/Sidebar/Sidebar';
5
+ export { default as MainHeader } from './components/common/Header/MainHeader';
6
+ export { SimpleSearchProvider, useSimpleSearch } from './components/common/Header/SimpleSearchContext';
7
+ export type { MainHeaderProps, MeiliSearchConfig } from './interfaces/components';
8
+ export type { SearchResult } from './components/common/Header/SimpleSearchContext';