browser-extension-manager 1.0.13 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/CLAUDE.md +672 -0
  3. package/TODO.md +3 -0
  4. package/dist/assets/css/browser-extension-manager.scss +18 -0
  5. package/dist/assets/css/components/content/index.scss +5 -0
  6. package/dist/assets/css/components/options/index.scss +5 -0
  7. package/dist/assets/css/components/pages/index.scss +5 -0
  8. package/dist/assets/css/components/popup/index.scss +5 -0
  9. package/dist/assets/css/core/_animations.scss +64 -0
  10. package/dist/assets/css/core/_initialize.scss +23 -0
  11. package/dist/assets/css/core/_utilities.scss +80 -0
  12. package/dist/assets/themes/_template/_theme.js +5 -0
  13. package/dist/assets/themes/_template/_theme.scss +5 -0
  14. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  15. package/dist/assets/themes/bootstrap/_theme.scss +232 -0
  16. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  17. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  18. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  19. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  20. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  21. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  22. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  23. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  24. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  25. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  26. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  27. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  28. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  29. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  30. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  31. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  32. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  33. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  34. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  35. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  36. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  37. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  38. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  39. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  40. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  41. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  42. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  43. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  44. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  45. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  46. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  47. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  48. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  49. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  50. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  51. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  52. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  53. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  54. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  55. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  56. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  57. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  58. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  59. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  60. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  61. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  62. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  63. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  64. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  65. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  66. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  67. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  68. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  69. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  70. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  71. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  72. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  73. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  74. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  75. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  76. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  77. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  78. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  79. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  80. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  81. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  82. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  83. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  84. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  85. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  86. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  87. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  88. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  89. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  90. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  91. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  92. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  93. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  94. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  95. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  96. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  97. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  98. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  99. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  100. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  101. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  102. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  103. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  104. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  105. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  106. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  107. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  108. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  109. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  110. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  111. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  112. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  113. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  114. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  115. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  116. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  117. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  118. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  119. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  120. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  121. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  122. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  123. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  124. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  125. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  126. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  127. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  128. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  129. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  130. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  131. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  132. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  133. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  134. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  135. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  136. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  137. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  138. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  139. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  140. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  141. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  142. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  143. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  144. package/dist/assets/themes/classy/README.md +75 -0
  145. package/dist/assets/themes/classy/_config.scss +185 -0
  146. package/dist/assets/themes/classy/_theme.js +29 -0
  147. package/dist/assets/themes/classy/_theme.scss +34 -0
  148. package/dist/assets/themes/classy/css/base/_animations.scss +27 -0
  149. package/dist/assets/themes/classy/css/base/_backgrounds.scss +191 -0
  150. package/dist/assets/themes/classy/css/base/_borders.scss +65 -0
  151. package/dist/assets/themes/classy/css/base/_root.scss +58 -0
  152. package/dist/assets/themes/classy/css/base/_soft-colors.scss +92 -0
  153. package/dist/assets/themes/classy/css/base/_spacing.scss +64 -0
  154. package/dist/assets/themes/classy/css/base/_typography.scss +179 -0
  155. package/dist/assets/themes/classy/css/base/_utilities.scss +77 -0
  156. package/dist/assets/themes/classy/css/components/_accordion.scss +33 -0
  157. package/dist/assets/themes/classy/css/components/_avatars.scss +32 -0
  158. package/dist/assets/themes/classy/css/components/_badges.scss +25 -0
  159. package/dist/assets/themes/classy/css/components/_buttons.scss +397 -0
  160. package/dist/assets/themes/classy/css/components/_cards.scss +33 -0
  161. package/dist/assets/themes/classy/css/components/_carousel.scss +41 -0
  162. package/dist/assets/themes/classy/css/components/_forms.scss +115 -0
  163. package/dist/assets/themes/classy/css/components/_links.scss +19 -0
  164. package/dist/assets/themes/classy/css/components/_logo-scroll.scss +57 -0
  165. package/dist/assets/themes/classy/css/components/_spinners.scss +19 -0
  166. package/dist/assets/themes/classy/css/components/_text.scss +41 -0
  167. package/dist/assets/themes/classy/css/layout/_blog.scss +42 -0
  168. package/dist/assets/themes/classy/css/layout/_general.scss +139 -0
  169. package/dist/assets/themes/classy/css/layout/_navigation.scss +576 -0
  170. package/dist/assets/themes/classy/css/layout/_team.scss +18 -0
  171. package/dist/assets/themes/classy/js/logo-scroll.js +83 -0
  172. package/dist/assets/themes/classy/js/navbar-scroll.js +65 -0
  173. package/dist/background.js +236 -260
  174. package/dist/build.js +93 -4
  175. package/dist/commands/setup.js +0 -268
  176. package/dist/config/manifest.json +11 -3
  177. package/dist/config/page-template.html +21 -0
  178. package/dist/defaults/.nvmrc +1 -1
  179. package/dist/defaults/CLAUDE.md +8 -0
  180. package/dist/defaults/config/browser-extension-manager.json +37 -0
  181. package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
  182. package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
  183. package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
  184. package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
  185. package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
  186. package/dist/defaults/src/assets/css/main.scss +32 -0
  187. package/dist/defaults/src/assets/js/components/background/index.js +22 -0
  188. package/dist/defaults/src/assets/js/components/content/index.js +22 -0
  189. package/dist/defaults/src/assets/js/components/options/index.js +22 -0
  190. package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
  191. package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
  192. package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
  193. package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
  194. package/dist/defaults/src/manifest.json +11 -6
  195. package/dist/defaults/src/views/options/index.html +8 -0
  196. package/dist/defaults/src/views/pages/index.html +10 -0
  197. package/dist/defaults/src/views/popup/index.html +4 -0
  198. package/dist/defaults/src/views/sidepanel/index.html +4 -0
  199. package/dist/gulp/main.js +11 -5
  200. package/dist/gulp/plugins/webpack/strip-dev-blocks.js +53 -0
  201. package/dist/gulp/tasks/{_package.js → BU/_package.js} +1 -1
  202. package/dist/gulp/tasks/{developmentRebuild.js → BU/developmentRebuild.js} +1 -1
  203. package/dist/gulp/tasks/{themes.js → BU/themes.js} +3 -2
  204. package/dist/gulp/tasks/{test.js → _.js} +3 -3
  205. package/dist/gulp/tasks/audit.js +154 -0
  206. package/dist/gulp/tasks/defaults.js +308 -0
  207. package/dist/gulp/tasks/distribute.js +87 -92
  208. package/dist/gulp/tasks/html.js +150 -0
  209. package/dist/gulp/tasks/icons.js +3 -2
  210. package/dist/gulp/tasks/package.js +216 -27
  211. package/dist/gulp/tasks/sass.js +188 -43
  212. package/dist/gulp/tasks/serve.js +1 -0
  213. package/dist/gulp/tasks/utils/template-transform.js +50 -0
  214. package/dist/gulp/tasks/webpack.js +338 -134
  215. package/dist/index.js +34 -34
  216. package/dist/options.js +40 -0
  217. package/dist/page.js +40 -0
  218. package/dist/popup.js +40 -0
  219. package/dist/sidepanel.js +40 -0
  220. package/firebase-debug.log +322 -0
  221. package/package.json +25 -18
  222. package/dist/assets/css/main.scss +0 -3
  223. package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css +0 -12057
  224. package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css.map +0 -1
  225. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js +0 -6314
  226. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js.map +0 -1
  227. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js +0 -4494
  228. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js.map +0 -1
  229. package/dist/defaults/src/assets/css/content.scss +0 -2
  230. package/dist/defaults/src/assets/css/options.scss +0 -11
  231. package/dist/defaults/src/assets/css/popup.scss +0 -14
  232. package/dist/defaults/src/assets/js/background.js +0 -18
  233. package/dist/defaults/src/assets/js/content.js +0 -15
  234. package/dist/defaults/src/assets/js/options.js +0 -17
  235. package/dist/defaults/src/assets/js/popup.js +0 -17
  236. package/dist/defaults/src/pages/options.html +0 -26
  237. package/dist/defaults/src/pages/popup.html +0 -26
  238. /package/dist/{defaults/src/assets/images/_ → assets/css/bundles/.gitkeep} +0 -0
  239. /package/dist/assets/css/{fontawesome.scss → core/_fontawesome.scss} +0 -0
  240. /package/dist/defaults/src/assets/{vendor/_ → images/.gitkeep} +0 -0
  241. /package/dist/gulp/tasks/{_importer.js → BU/_importer.js} +0 -0
  242. /package/dist/gulp/tasks/{_vendor.js → BU/_vendor.js} +0 -0
@@ -0,0 +1,576 @@
1
+ // Classy Navigation Components
2
+ // Modern floating navbar inspired by premium SaaS websites
3
+
4
+ // ============================================
5
+ // Floating Navbar Container
6
+ // ============================================
7
+ .navbar-wrapper {
8
+ position: fixed;
9
+ top: 1rem;
10
+ left: 0;
11
+ right: 0;
12
+ z-index: 1030;
13
+ pointer-events: none;
14
+
15
+ .navbar {
16
+ pointer-events: auto;
17
+ // Match Bootstrap's container exactly (same as .container class)
18
+ width: 100%;
19
+ margin-right: auto;
20
+ margin-left: auto;
21
+ padding-right: var(--bs-gutter-x, 0.75rem);
22
+ padding-left: var(--bs-gutter-x, 0.75rem);
23
+
24
+ // XS screens (less than 576px) - maintain margin
25
+ @media (max-width: 575.98px) {
26
+ max-width: calc(100% - 2rem);
27
+ margin-left: auto;
28
+ margin-right: auto;
29
+ }
30
+
31
+ @media (min-width: 576px) {
32
+ max-width: 540px;
33
+ }
34
+
35
+ @media (min-width: 768px) {
36
+ max-width: 720px;
37
+ }
38
+
39
+ @media (min-width: 992px) {
40
+ max-width: 960px;
41
+ }
42
+
43
+ @media (min-width: 1200px) {
44
+ max-width: 1140px;
45
+ }
46
+
47
+ @media (min-width: 1400px) {
48
+ max-width: 1320px;
49
+ }
50
+ }
51
+ }
52
+
53
+ // ============================================
54
+ // Floating Navbar Styles
55
+ // ============================================
56
+ .navbar {
57
+ &.navbar-floating {
58
+ border-radius: 1rem;
59
+ padding: 0.75rem 1rem;
60
+ background: transparent !important;
61
+ border: 1px solid rgba(0, 0, 0, 0.06);
62
+ transition: all 0.3s ease;
63
+
64
+ // Container inside navbar
65
+ .container,
66
+ .container-fluid {
67
+ padding: 0;
68
+ }
69
+
70
+ // Always show glassy background on mobile
71
+ @media (max-width: 991.98px) {
72
+ @include glassy-effect;
73
+ }
74
+ }
75
+ }
76
+
77
+ // ============================================
78
+ // Brand & Logo
79
+ // ============================================
80
+ .navbar-brand {
81
+ font-weight: 700;
82
+ font-size: 1.25rem;
83
+ letter-spacing: -0.02em;
84
+
85
+ // Logo with text
86
+ .brand-logo {
87
+ height: 32px;
88
+ width: auto;
89
+ margin-right: 0.5rem;
90
+ }
91
+ }
92
+
93
+ .card-body {
94
+ .nav-link {
95
+ color: var(--bs-body-color);
96
+ border-radius: 0.375rem;
97
+ padding: 0.5rem 1rem;
98
+ margin-bottom: 0.25rem;
99
+ transition: all 0.2s ease-in-out;
100
+ white-space: nowrap;
101
+ overflow: hidden;
102
+ text-overflow: ellipsis;
103
+
104
+ &:hover {
105
+ background-color: rgba(0, 0, 0, 0.2);
106
+ }
107
+
108
+ &.active {
109
+ background-color: var(--bs-primary);
110
+ color: white;
111
+
112
+ .fa-icon {
113
+ color: white;
114
+ }
115
+ }
116
+ }
117
+ }
118
+
119
+ // ============================================
120
+ // Navigation Links
121
+ // ============================================
122
+ .navbar-nav {
123
+ .nav-link {
124
+ font-weight: 500;
125
+ font-size: 0.95rem;
126
+ padding: 0.5rem 1rem;
127
+ margin: 0 0.125rem;
128
+ border-radius: 0.5rem;
129
+ transition: all 0.2s ease;
130
+ position: relative;
131
+ color: var(--bs-body-color);
132
+
133
+ &:hover {
134
+ background-color: rgba(0, 0, 0, 0.05);
135
+ }
136
+
137
+ &.active {
138
+ background-color: rgba(0, 0, 0, 0.08);
139
+ }
140
+ }
141
+
142
+ // Dark mode nav links
143
+ [data-bs-theme="dark"] & {
144
+ .nav-link {
145
+ &:hover {
146
+ background-color: rgba(255, 255, 255, 0.05);
147
+ }
148
+
149
+ &.active {
150
+ background-color: rgba(255, 255, 255, 0.08);
151
+ }
152
+ }
153
+ }
154
+ }
155
+
156
+ // ============================================
157
+ // Mobile Toggle Button
158
+ // ============================================
159
+ .navbar-toggler {
160
+ border: 1px solid rgba(0, 0, 0, 0.1);
161
+ padding: 0.25rem 0.5rem;
162
+ border-radius: $classy-radius-md;
163
+ transition: $classy-transition-fast;
164
+ background: rgba(255, 255, 255, 0.9);
165
+
166
+ &:hover {
167
+ background: rgba(255, 255, 255, 1);
168
+ border-color: rgba(0, 0, 0, 0.2);
169
+ }
170
+
171
+ &:focus {
172
+ box-shadow: 0 0 0 0.25rem rgba($classy-primary, 0.25);
173
+ }
174
+
175
+ .navbar-toggler-icon {
176
+ width: 1.25em;
177
+ height: 1.25em;
178
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
179
+ }
180
+
181
+ // Dark mode styles for toggle button
182
+ [data-bs-theme="dark"] & {
183
+ background: rgba(33, 37, 41, 0.9);
184
+ border-color: rgba(255, 255, 255, 0.1);
185
+
186
+ &:hover {
187
+ background: rgba(33, 37, 41, 1);
188
+ border-color: rgba(255, 255, 255, 0.2);
189
+ }
190
+
191
+ .navbar-toggler-icon {
192
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
193
+ }
194
+ }
195
+ }
196
+
197
+ // ============================================
198
+ // Sticky Navigation
199
+ // ============================================
200
+ .navbar-sticky {
201
+ position: fixed;
202
+ top: 0;
203
+ left: 0;
204
+ right: 0;
205
+ z-index: 1030;
206
+ animation: slideDown 0.3s ease-out;
207
+
208
+ &.scrolled {
209
+ background: rgba(255, 255, 255, 0.95);
210
+ }
211
+ }
212
+
213
+ @keyframes slideDown {
214
+ from {
215
+ transform: translateY(-100%);
216
+ opacity: 0;
217
+ }
218
+ to {
219
+ transform: translateY(0);
220
+ opacity: 1;
221
+ }
222
+ }
223
+
224
+ // ============================================
225
+ // Secondary Navigation
226
+ // ============================================
227
+ .subnav {
228
+ background: $classy-off-white;
229
+ border-bottom: 1px solid $classy-gray-lightest;
230
+ padding: 0.75rem 0;
231
+
232
+ .nav-link {
233
+ font-size: 0.875rem;
234
+ font-weight: 500;
235
+ padding: 0.5rem 1rem;
236
+ border-radius: $classy-radius-md;
237
+
238
+ &:hover {
239
+ background: $classy-white;
240
+ }
241
+
242
+ &.active {
243
+ background: $classy-white;
244
+ box-shadow: $classy-shadow-sm;
245
+ }
246
+ }
247
+ }
248
+
249
+ // ============================================
250
+ // Dropdown Menus
251
+ // ============================================
252
+ .dropdown-menu {
253
+ background: rgba(var(--bs-secondary-bg-rgb), 0.95);
254
+ backdrop-filter: blur(20px);
255
+ -webkit-backdrop-filter: blur(20px);
256
+ border: 1px solid rgba(0, 0, 0, 0.08);
257
+ border-radius: $classy-radius-xl;
258
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
259
+ padding: 0.5rem;
260
+ margin-top: 0.5rem;
261
+ min-width: 200px;
262
+
263
+ .dropdown-item {
264
+ padding: 0.625rem 1rem;
265
+ border-radius: $classy-radius-lg;
266
+ font-weight: 500;
267
+ transition: all 0.2s ease;
268
+ color: var(--bs-body-color);
269
+ background: transparent;
270
+
271
+ &:hover {
272
+ background: rgba($primary, 0.08);
273
+ color: $primary;
274
+ transform: none;
275
+ }
276
+
277
+ &.active,
278
+ &:active {
279
+ background: rgba(0, 0, 0, 0.08);
280
+ color: var(--bs-body-color);
281
+ }
282
+
283
+ &:focus {
284
+ background: rgba($primary, 0.08);
285
+ outline: none;
286
+ }
287
+
288
+ // Support for text utility classes
289
+ &.text-danger {
290
+ color: $danger !important;
291
+
292
+ &:hover {
293
+ background: rgba($danger, 0.08);
294
+ color: $danger !important;
295
+ }
296
+ }
297
+
298
+ &.text-warning {
299
+ color: $warning !important;
300
+
301
+ &:hover {
302
+ background: rgba($warning, 0.08);
303
+ color: $warning !important;
304
+ }
305
+ }
306
+
307
+ &.text-success {
308
+ color: $success !important;
309
+
310
+ &:hover {
311
+ background: rgba($success, 0.08);
312
+ color: $success !important;
313
+ }
314
+ }
315
+ }
316
+
317
+ .dropdown-divider {
318
+ margin: 0.5rem 0;
319
+ opacity: 0.1;
320
+ border-color: currentColor;
321
+ }
322
+ }
323
+
324
+ // ============================================
325
+ // Dark Mode Dropdowns
326
+ // ============================================
327
+ [data-bs-theme="dark"] {
328
+ .dropdown-menu {
329
+ background: rgba(var(--bs-secondary-bg-rgb), 0.95);
330
+ border: 1px solid rgba(255, 255, 255, 0.1);
331
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
332
+
333
+ .dropdown-item {
334
+ color: var(--bs-body-color);
335
+
336
+ &:hover {
337
+ background: rgba(255, 255, 255, 0.1);
338
+ color: white;
339
+ }
340
+
341
+ &.active,
342
+ &:active {
343
+ background: rgba(255, 255, 255, 0.08);
344
+ color: var(--bs-body-color);
345
+ }
346
+
347
+ &:focus {
348
+ background: rgba(255, 255, 255, 0.05);
349
+ }
350
+
351
+ // Support for text utility classes in dark mode
352
+ &.text-danger {
353
+ color: $danger !important;
354
+
355
+ &:hover {
356
+ background: rgba($danger, 0.15);
357
+ color: lighten($danger, 10%) !important;
358
+ }
359
+ }
360
+
361
+ &.text-warning {
362
+ color: $warning !important;
363
+
364
+ &:hover {
365
+ background: rgba($warning, 0.15);
366
+ color: lighten($warning, 10%) !important;
367
+ }
368
+ }
369
+
370
+ &.text-success {
371
+ color: $success !important;
372
+
373
+ &:hover {
374
+ background: rgba($success, 0.15);
375
+ color: lighten($success, 10%) !important;
376
+ }
377
+ }
378
+ }
379
+ }
380
+ }
381
+
382
+ // ============================================
383
+ // Breadcrumb Navigation
384
+ // ============================================
385
+ .breadcrumb {
386
+ background: transparent;
387
+ padding: 0;
388
+ margin-bottom: 0;
389
+
390
+ .breadcrumb-item {
391
+ font-size: 0.875rem;
392
+
393
+ + .breadcrumb-item::before {
394
+ content: "→";
395
+ padding: 0 0.5rem;
396
+ }
397
+
398
+ &.active {
399
+ font-weight: 500;
400
+ }
401
+
402
+ a {
403
+ text-decoration: none;
404
+ transition: $classy-transition-fast;
405
+
406
+ &:hover {
407
+ }
408
+ }
409
+ }
410
+ }
411
+
412
+ // ============================================
413
+ // Backend Layout Components
414
+ // ============================================
415
+ .sidebar {
416
+ width: 280px;
417
+
418
+ .sidebar-logo {
419
+ height: 60px; // Fixed height for logo section
420
+ flex-shrink: 0;
421
+ }
422
+ }
423
+
424
+ .topbar {
425
+ height: 60px; // Match sidebar logo height
426
+
427
+ // Ensure content is vertically centered
428
+ > div {
429
+ height: 100%;
430
+ }
431
+ }
432
+
433
+ // ============================================
434
+ // Backend Sidebar (Bootstrap Collapsible)
435
+ // ============================================
436
+ .btn-toggle {
437
+ display: inline-flex;
438
+ align-items: center;
439
+ padding: .5rem .75rem;
440
+ font-weight: 600;
441
+ color: var(--bs-emphasis-color);
442
+ background-color: transparent;
443
+ border: 0;
444
+ width: 100%;
445
+
446
+ &:hover,
447
+ &:focus {
448
+ color: rgba(var(--bs-emphasis-color-rgb), .85);
449
+ background-color: rgba(0, 0, 0, 0.05);
450
+ }
451
+
452
+ &.active {
453
+ color: var(--bs-emphasis-color);
454
+ background-color: rgba(0, 0, 0, 0.08);
455
+ }
456
+
457
+ &::after {
458
+ width: 1.25em;
459
+ line-height: 0;
460
+ content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
461
+ transition: transform .35s ease;
462
+ transform-origin: .5em 50%;
463
+ }
464
+
465
+ &[aria-expanded="true"] {
466
+ color: rgba(var(--bs-emphasis-color-rgb), .85);
467
+ }
468
+
469
+ &[aria-expanded="true"]::after {
470
+ transform: rotate(90deg);
471
+ }
472
+ }
473
+
474
+ [data-bs-theme="dark"] {
475
+ .btn-toggle {
476
+ &:hover,
477
+ &:focus {
478
+ background-color: rgba(255, 255, 255, 0.08);
479
+ }
480
+
481
+ &.active {
482
+ background-color: rgba(255, 255, 255, 0.12);
483
+ }
484
+
485
+ &::after {
486
+ content: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e");
487
+ }
488
+ }
489
+ }
490
+
491
+ .btn-toggle-nav a {
492
+ display: block;
493
+ padding: .375rem .75rem;
494
+ margin-top: .125rem;
495
+ margin-left: 1.25rem;
496
+ margin-right: .5rem;
497
+ border-radius: .375rem;
498
+ color: var(--bs-body-color);
499
+ text-decoration: none;
500
+
501
+ &:hover,
502
+ &:focus {
503
+ background-color: rgba(0, 0, 0, 0.05);
504
+ color: var(--bs-emphasis-color);
505
+ }
506
+
507
+ &.active {
508
+ color: var(--bs-emphasis-color);
509
+ background-color: rgba(0, 0, 0, 0.08);
510
+ }
511
+ }
512
+
513
+ // Regular sidebar links (non-dropdown)
514
+ aside.sidebar,
515
+ nav {
516
+ .link-body-emphasis {
517
+ &.d-flex {
518
+ &:hover,
519
+ &:focus {
520
+ background-color: rgba(0, 0, 0, 0.05);
521
+ }
522
+
523
+ &.active {
524
+ color: var(--bs-emphasis-color);
525
+ background-color: rgba(0, 0, 0, 0.08);
526
+ }
527
+
528
+ // Logo link - no hover effects
529
+ &.border-bottom {
530
+ &:hover,
531
+ &:focus {
532
+ background-color: transparent !important;
533
+ }
534
+ }
535
+ }
536
+ }
537
+ }
538
+
539
+ // Dark mode overrides for all sidebar links
540
+ [data-bs-theme="dark"] {
541
+ .btn-toggle-nav a {
542
+ &:hover,
543
+ &:focus {
544
+ background-color: rgba(255, 255, 255, 0.08);
545
+ color: var(--bs-emphasis-color);
546
+ }
547
+
548
+ &.active {
549
+ background-color: rgba(255, 255, 255, 0.12);
550
+ }
551
+ }
552
+
553
+ aside.sidebar,
554
+ nav {
555
+ .link-body-emphasis {
556
+ &.d-flex {
557
+ &:hover,
558
+ &:focus {
559
+ background-color: rgba(255, 255, 255, 0.08);
560
+ }
561
+
562
+ &.active {
563
+ background-color: rgba(255, 255, 255, 0.12);
564
+ }
565
+
566
+ // Logo link - no hover effects in dark mode
567
+ &.border-bottom {
568
+ &:hover,
569
+ &:focus {
570
+ background-color: transparent !important;
571
+ }
572
+ }
573
+ }
574
+ }
575
+ }
576
+ }
@@ -0,0 +1,18 @@
1
+ .team-member-image {
2
+ height: 160px;
3
+ width: 160px;
4
+ }
5
+
6
+ @media (max-width: 991.98px) {
7
+ .team-member-image {
8
+ height: 140px;
9
+ width: 140px;
10
+ }
11
+ }
12
+
13
+ @media (max-width: 575.98px) {
14
+ .team-member-image {
15
+ height: 120px;
16
+ width: 120px;
17
+ }
18
+ }
@@ -0,0 +1,83 @@
1
+ // Setup speed
2
+ const SCROLL_SPEED_PX_PER_SECOND = 40; // Pixels per second
3
+
4
+ // Logo scroll animation setup
5
+ export default function setupLogoScroll() {
6
+ const scrollTracks = document.querySelectorAll('.logo-scroll-track');
7
+
8
+ scrollTracks.forEach(track => {
9
+ if (!track) {
10
+ return;
11
+ }
12
+
13
+ // Get original logos
14
+ const originalLogos = Array.from(track.children);
15
+ if (originalLogos.length === 0) {
16
+ return;
17
+ }
18
+
19
+ // Calculate total width of original logos
20
+ let totalWidth = 0;
21
+ originalLogos.forEach(logo => {
22
+ totalWidth += logo.getBoundingClientRect().width;
23
+ });
24
+
25
+ // Calculate how many sets we need to fill the screen plus extra for smooth scrolling
26
+ const viewportWidth = window.innerWidth;
27
+ const setsNeeded = Math.ceil((viewportWidth * 2.5) / totalWidth);
28
+
29
+ // Clone logo sets
30
+ for (let i = 0; i < setsNeeded; i++) {
31
+ originalLogos.forEach(logo => {
32
+ const clone = logo.cloneNode(true);
33
+ track.appendChild(clone);
34
+ });
35
+ }
36
+
37
+ // Calculate animation duration based on total width
38
+ // Slower speed for better visibility
39
+ const allLogos = track.children;
40
+ let animationWidth = 0;
41
+
42
+ // Calculate width of half the logos (for the 50% translation)
43
+ const halfCount = Math.floor(allLogos.length / 2);
44
+ for (let i = 0; i < halfCount; i++) {
45
+ animationWidth += allLogos[i].getBoundingClientRect().width;
46
+ }
47
+
48
+ // Set CSS variables for animation
49
+ const duration = animationWidth / SCROLL_SPEED_PX_PER_SECOND;
50
+ track.style.setProperty('--logo-scroll-duration', `${duration}s`);
51
+ track.style.setProperty('--logo-scroll-distance', `-${animationWidth}px`);
52
+
53
+ // Restart animation when it completes to ensure seamless loop
54
+ track.addEventListener('animationiteration', () => {
55
+ // Reset the animation to prevent accumulation of drift
56
+ track.style.animation = 'none';
57
+ track.offsetHeight; // Trigger reflow
58
+ track.style.animation = `scroll-logos var(--logo-scroll-duration, ${duration}s) linear infinite`;
59
+ });
60
+ });
61
+
62
+ // Recalculate on window resize
63
+ let resizeTimeout;
64
+ window.addEventListener('resize', () => {
65
+ clearTimeout(resizeTimeout);
66
+ resizeTimeout = setTimeout(() => {
67
+ // Reset and recalculate
68
+ scrollTracks.forEach(track => {
69
+ // Remove cloned logos
70
+ const logos = Array.from(track.children);
71
+ const originalCount = logos.length / (Math.ceil(logos.length / 8)); // Estimate original count
72
+
73
+ // Keep only estimated original logos
74
+ while (track.children.length > 8) { // Assuming max 8 original logos
75
+ track.removeChild(track.lastChild);
76
+ }
77
+ });
78
+
79
+ // Re-run setup
80
+ setupLogoScroll();
81
+ }, 250);
82
+ });
83
+ }