@tonyarbor/components 0.7.0 → 0.7.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.
@@ -0,0 +1,182 @@
1
+ import {
2
+ AvatarLogoLockup
3
+ } from "./chunk-HG2ORLLW.mjs";
4
+ import {
5
+ TopNavItem
6
+ } from "./chunk-AVYGOALO.mjs";
7
+ import {
8
+ SearchGlobal
9
+ } from "./chunk-UPBHDBAK.mjs";
10
+ import {
11
+ Button
12
+ } from "./chunk-NOUFR6W2.mjs";
13
+
14
+ // src/TopNavBar/TopNavBar.tsx
15
+ import * as React from "react";
16
+ import { Sparkles } from "lucide-react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ var TopNavBar = React.forwardRef(
19
+ ({
20
+ schoolLogoSrc,
21
+ schoolLogoAlt = "School logo",
22
+ onSchoolLogoClick,
23
+ navItems = [],
24
+ onNavItemClick,
25
+ searchValue = "",
26
+ onSearchChange,
27
+ onSearchSubmit,
28
+ onSearchClear,
29
+ actionButtonLabel = "Ask Arbor",
30
+ onActionButtonClick,
31
+ showActionButton = true,
32
+ avatarSrc,
33
+ avatarInitials,
34
+ avatarAlt = "User avatar",
35
+ onAvatarClick,
36
+ onLogoClick,
37
+ className,
38
+ style
39
+ }, ref) => {
40
+ const containerStyles = {
41
+ position: "fixed",
42
+ top: 0,
43
+ left: 0,
44
+ right: 0,
45
+ display: "flex",
46
+ alignItems: "center",
47
+ justifyContent: "space-between",
48
+ padding: "4px 8px",
49
+ backgroundColor: "#ffffff",
50
+ boxShadow: "0px 1px 2px 0px rgba(0, 0, 0, 0.08)",
51
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
52
+ boxSizing: "border-box",
53
+ zIndex: 1e3,
54
+ height: "48px",
55
+ ...style
56
+ };
57
+ const leftSectionStyles = {
58
+ display: "flex",
59
+ alignItems: "center",
60
+ gap: "16px"
61
+ };
62
+ const schoolLogoContainerStyles = {
63
+ display: "flex",
64
+ alignItems: "center",
65
+ justifyContent: "center",
66
+ width: "64px",
67
+ height: "40px",
68
+ backgroundColor: "#ffffff",
69
+ border: "1px solid #efefef",
70
+ borderRadius: "8px",
71
+ overflow: "hidden",
72
+ padding: "2px",
73
+ boxSizing: "border-box",
74
+ cursor: onSchoolLogoClick ? "pointer" : "default"
75
+ };
76
+ const schoolLogoImageStyles = {
77
+ maxWidth: "100%",
78
+ maxHeight: "100%",
79
+ objectFit: "contain"
80
+ };
81
+ const placeholderStyles = {
82
+ width: "100%",
83
+ height: "100%",
84
+ display: "flex",
85
+ alignItems: "center",
86
+ justifyContent: "center",
87
+ backgroundColor: "#f8f8f8",
88
+ color: "#949494",
89
+ fontSize: "10px",
90
+ fontWeight: 500,
91
+ textAlign: "center"
92
+ };
93
+ const navItemsGroupStyles = {
94
+ display: "flex",
95
+ alignItems: "center",
96
+ gap: "8px"
97
+ };
98
+ const rightSectionStyles = {
99
+ display: "flex",
100
+ alignItems: "center",
101
+ gap: "16px"
102
+ };
103
+ const actionButtonStyles = {
104
+ display: "flex",
105
+ alignItems: "center",
106
+ gap: "8px"
107
+ };
108
+ const SchoolLogoElement = onSchoolLogoClick ? "button" : "div";
109
+ return /* @__PURE__ */ jsxs("nav", { ref, className, style: containerStyles, children: [
110
+ /* @__PURE__ */ jsxs("div", { style: leftSectionStyles, children: [
111
+ /* @__PURE__ */ jsx(
112
+ SchoolLogoElement,
113
+ {
114
+ style: {
115
+ ...schoolLogoContainerStyles,
116
+ ...onSchoolLogoClick ? { outline: "none", border: "1px solid #efefef" } : {}
117
+ },
118
+ onClick: onSchoolLogoClick,
119
+ ...onSchoolLogoClick ? { type: "button" } : {},
120
+ children: schoolLogoSrc ? /* @__PURE__ */ jsx(
121
+ "img",
122
+ {
123
+ src: schoolLogoSrc,
124
+ alt: schoolLogoAlt,
125
+ style: schoolLogoImageStyles
126
+ }
127
+ ) : /* @__PURE__ */ jsx("div", { style: placeholderStyles, children: "Logo" })
128
+ }
129
+ ),
130
+ /* @__PURE__ */ jsx("div", { style: navItemsGroupStyles, children: navItems.map((item) => /* @__PURE__ */ jsx(
131
+ TopNavItem,
132
+ {
133
+ active: item.active,
134
+ onClick: () => onNavItemClick?.(item),
135
+ children: item.label
136
+ },
137
+ item.id
138
+ )) })
139
+ ] }),
140
+ /* @__PURE__ */ jsxs("div", { style: rightSectionStyles, children: [
141
+ /* @__PURE__ */ jsx(
142
+ SearchGlobal,
143
+ {
144
+ value: searchValue,
145
+ onChange: onSearchChange,
146
+ onSubmit: onSearchSubmit,
147
+ onClear: onSearchClear
148
+ }
149
+ ),
150
+ showActionButton && /* @__PURE__ */ jsxs(
151
+ Button,
152
+ {
153
+ variant: "secondary",
154
+ size: "small",
155
+ onClick: onActionButtonClick,
156
+ style: actionButtonStyles,
157
+ children: [
158
+ /* @__PURE__ */ jsx(Sparkles, { size: 16, strokeWidth: 2 }),
159
+ actionButtonLabel
160
+ ]
161
+ }
162
+ ),
163
+ /* @__PURE__ */ jsx(
164
+ AvatarLogoLockup,
165
+ {
166
+ avatarSrc,
167
+ avatarInitials,
168
+ avatarAlt,
169
+ onAvatarClick,
170
+ onLogoClick
171
+ }
172
+ )
173
+ ] })
174
+ ] });
175
+ }
176
+ );
177
+ TopNavBar.displayName = "TopNavBar";
178
+
179
+ export {
180
+ TopNavBar
181
+ };
182
+ //# sourceMappingURL=chunk-YUXQQX7M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TopNavBar/TopNavBar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Sparkles } from 'lucide-react';\nimport { TopNavItem } from '../TopNavItem';\nimport { SearchGlobal } from '../SearchGlobal';\nimport { Button } from '../Button';\nimport { AvatarLogoLockup } from '../AvatarLogoLockup';\n\nexport interface NavItem {\n /**\n * Unique identifier for the nav item\n */\n id: string;\n /**\n * Display label for the nav item\n */\n label: string;\n /**\n * Whether this nav item is currently active\n */\n active?: boolean;\n}\n\nexport interface TopNavBarProps {\n /**\n * School logo image source URL\n */\n schoolLogoSrc?: string;\n /**\n * Alt text for school logo\n */\n schoolLogoAlt?: string;\n /**\n * Click handler for school logo\n */\n onSchoolLogoClick?: () => void;\n /**\n * Array of navigation items\n */\n navItems?: NavItem[];\n /**\n * Callback when a nav item is clicked\n */\n onNavItemClick?: (item: NavItem) => void;\n /**\n * Search value\n */\n searchValue?: string;\n /**\n * Search change handler\n */\n onSearchChange?: (value: string) => void;\n /**\n * Search submit handler\n */\n onSearchSubmit?: (value: string) => void;\n /**\n * Search clear handler\n */\n onSearchClear?: () => void;\n /**\n * Action button label (e.g., \"Ask Arbor\")\n */\n actionButtonLabel?: string;\n /**\n * Action button click handler\n */\n onActionButtonClick?: () => void;\n /**\n * Whether to show the action button\n */\n showActionButton?: boolean;\n /**\n * User avatar image source URL\n */\n avatarSrc?: string;\n /**\n * User avatar initials (fallback when no image)\n */\n avatarInitials?: string;\n /**\n * User avatar alt text\n */\n avatarAlt?: string;\n /**\n * Avatar section click handler\n */\n onAvatarClick?: () => void;\n /**\n * Logo section click handler\n */\n onLogoClick?: () => void;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n}\n\n/**\n * TopNavBar component - Arbor Design System\n *\n * A full-width navigation bar fixed to the top of the page.\n * Contains school logo, navigation items, search, action button, and avatar-logo lockup.\n */\nexport const TopNavBar = React.forwardRef<HTMLElement, TopNavBarProps>(\n (\n {\n schoolLogoSrc,\n schoolLogoAlt = 'School logo',\n onSchoolLogoClick,\n navItems = [],\n onNavItemClick,\n searchValue = '',\n onSearchChange,\n onSearchSubmit,\n onSearchClear,\n actionButtonLabel = 'Ask Arbor',\n onActionButtonClick,\n showActionButton = true,\n avatarSrc,\n avatarInitials,\n avatarAlt = 'User avatar',\n onAvatarClick,\n onLogoClick,\n className,\n style,\n },\n ref\n ) => {\n const containerStyles: React.CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '4px 8px',\n backgroundColor: '#ffffff',\n boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.08)',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n boxSizing: 'border-box',\n zIndex: 1000,\n height: '48px',\n ...style,\n };\n\n const leftSectionStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n };\n\n const schoolLogoContainerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '64px',\n height: '40px',\n backgroundColor: '#ffffff',\n border: '1px solid #efefef',\n borderRadius: '8px',\n overflow: 'hidden',\n padding: '2px',\n boxSizing: 'border-box',\n cursor: onSchoolLogoClick ? 'pointer' : 'default',\n };\n\n const schoolLogoImageStyles: React.CSSProperties = {\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n };\n\n const placeholderStyles: React.CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#f8f8f8',\n color: '#949494',\n fontSize: '10px',\n fontWeight: 500,\n textAlign: 'center',\n };\n\n const navItemsGroupStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n };\n\n const rightSectionStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n };\n\n const actionButtonStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n };\n\n const SchoolLogoElement = onSchoolLogoClick ? 'button' : 'div';\n\n return (\n <nav ref={ref} className={className} style={containerStyles}>\n {/* Left section: School logo + Nav items */}\n <div style={leftSectionStyles}>\n <SchoolLogoElement\n style={{\n ...schoolLogoContainerStyles,\n ...(onSchoolLogoClick ? { outline: 'none', border: '1px solid #efefef' } : {}),\n }}\n onClick={onSchoolLogoClick}\n {...(onSchoolLogoClick ? { type: 'button' } : {})}\n >\n {schoolLogoSrc ? (\n <img\n src={schoolLogoSrc}\n alt={schoolLogoAlt}\n style={schoolLogoImageStyles}\n />\n ) : (\n <div style={placeholderStyles}>Logo</div>\n )}\n </SchoolLogoElement>\n\n <div style={navItemsGroupStyles}>\n {navItems.map((item) => (\n <TopNavItem\n key={item.id}\n active={item.active}\n onClick={() => onNavItemClick?.(item)}\n >\n {item.label}\n </TopNavItem>\n ))}\n </div>\n </div>\n\n {/* Right section: Search + Action button + Avatar-Logo lockup */}\n <div style={rightSectionStyles}>\n <SearchGlobal\n value={searchValue}\n onChange={onSearchChange}\n onSubmit={onSearchSubmit}\n onClear={onSearchClear}\n />\n\n {showActionButton && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onActionButtonClick}\n style={actionButtonStyles}\n >\n <Sparkles size={16} strokeWidth={2} />\n {actionButtonLabel}\n </Button>\n )}\n\n <AvatarLogoLockup\n avatarSrc={avatarSrc}\n avatarInitials={avatarInitials}\n avatarAlt={avatarAlt}\n onAvatarClick={onAvatarClick}\n onLogoClick={onLogoClick}\n />\n </div>\n </nav>\n );\n }\n);\n\nTopNavBar.displayName = 'TopNavBar';\n"],"mappings":"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","names":[]}
package/dist/index.d.mts CHANGED
@@ -34,6 +34,9 @@ export { Section, SectionProps } from './Section.mjs';
34
34
  export { ModalHeader, ModalHeaderProps } from './ModalHeader.mjs';
35
35
  export { ModalFooter, ModalFooterProps } from './ModalFooter.mjs';
36
36
  export { Modal, ModalContent, ModalContentProps, ModalProps } from './Modal.mjs';
37
+ export { AvatarLogoLockup, AvatarLogoLockupProps } from './AvatarLogoLockup.mjs';
38
+ export { TopNavItem, TopNavItemProps } from './TopNavItem.mjs';
39
+ export { NavItem, TopNavBar, TopNavBarProps } from './TopNavBar.mjs';
37
40
  import 'react';
38
41
 
39
42
  /**
package/dist/index.d.ts CHANGED
@@ -34,6 +34,9 @@ export { Section, SectionProps } from './Section.js';
34
34
  export { ModalHeader, ModalHeaderProps } from './ModalHeader.js';
35
35
  export { ModalFooter, ModalFooterProps } from './ModalFooter.js';
36
36
  export { Modal, ModalContent, ModalContentProps, ModalProps } from './Modal.js';
37
+ export { AvatarLogoLockup, AvatarLogoLockupProps } from './AvatarLogoLockup.js';
38
+ export { TopNavItem, TopNavItemProps } from './TopNavItem.js';
39
+ export { NavItem, TopNavBar, TopNavBarProps } from './TopNavBar.js';
37
40
  import 'react';
38
41
 
39
42
  /**
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var src_exports = {};
32
32
  __export(src_exports, {
33
33
  Avatar: () => Avatar,
34
+ AvatarLogoLockup: () => AvatarLogoLockup,
34
35
  Banner: () => Banner,
35
36
  Breadcrumbs: () => Breadcrumbs,
36
37
  Button: () => Button,
@@ -66,7 +67,9 @@ __export(src_exports, {
66
67
  TextArea: () => TextArea,
67
68
  Toast: () => Toast,
68
69
  Toggle: () => Toggle,
69
- Tooltip: () => Tooltip
70
+ Tooltip: () => Tooltip,
71
+ TopNavBar: () => TopNavBar,
72
+ TopNavItem: () => TopNavItem
70
73
  });
71
74
  module.exports = __toCommonJS(src_exports);
72
75
 
@@ -6408,9 +6411,348 @@ var ModalContent = React36.forwardRef(
6408
6411
  }
6409
6412
  );
6410
6413
  ModalContent.displayName = "ModalContent";
6414
+
6415
+ // src/AvatarLogoLockup/AvatarLogoLockup.tsx
6416
+ var React37 = __toESM(require("react"));
6417
+ var import_lucide_react14 = require("lucide-react");
6418
+ var import_jsx_runtime37 = require("react/jsx-runtime");
6419
+ var AvatarLogoLockup = React37.forwardRef(
6420
+ ({
6421
+ avatarSrc,
6422
+ avatarInitials,
6423
+ avatarAlt = "User avatar",
6424
+ onAvatarClick,
6425
+ onLogoClick,
6426
+ className,
6427
+ style
6428
+ }, ref) => {
6429
+ const [isHovered, setIsHovered] = React37.useState(false);
6430
+ const containerStyles6 = {
6431
+ display: "inline-flex",
6432
+ alignItems: "center",
6433
+ gap: "4px",
6434
+ padding: "4px",
6435
+ height: "40px",
6436
+ backgroundColor: isHovered ? "#f8f8f8" : "#ffffff",
6437
+ border: "1px solid #efefef",
6438
+ borderRadius: "99px",
6439
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
6440
+ boxSizing: "border-box",
6441
+ transition: "background-color 0.15s ease-in-out",
6442
+ ...style
6443
+ };
6444
+ const avatarSectionStyles = {
6445
+ display: "flex",
6446
+ alignItems: "center",
6447
+ gap: "4px",
6448
+ borderRadius: "99px",
6449
+ cursor: onAvatarClick ? "pointer" : "default",
6450
+ backgroundColor: "transparent",
6451
+ border: "none",
6452
+ padding: 0
6453
+ };
6454
+ const dividerStyles = {
6455
+ width: "1px",
6456
+ height: "24px",
6457
+ backgroundColor: "#efefef",
6458
+ flexShrink: 0
6459
+ };
6460
+ const logoSectionStyles = {
6461
+ display: "flex",
6462
+ alignItems: "center",
6463
+ cursor: onLogoClick ? "pointer" : "default",
6464
+ padding: 0
6465
+ };
6466
+ const AvatarSection = onAvatarClick ? "button" : "div";
6467
+ const LogoSection = onLogoClick ? "button" : "div";
6468
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
6469
+ "div",
6470
+ {
6471
+ ref,
6472
+ className,
6473
+ style: containerStyles6,
6474
+ onMouseEnter: () => setIsHovered(true),
6475
+ onMouseLeave: () => setIsHovered(false),
6476
+ children: [
6477
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
6478
+ AvatarSection,
6479
+ {
6480
+ style: {
6481
+ ...avatarSectionStyles,
6482
+ ...onAvatarClick ? { outline: "none" } : {}
6483
+ },
6484
+ onClick: onAvatarClick,
6485
+ ...onAvatarClick ? { type: "button" } : {},
6486
+ children: [
6487
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
6488
+ Avatar,
6489
+ {
6490
+ size: "medium",
6491
+ src: avatarSrc,
6492
+ initials: avatarInitials,
6493
+ alt: avatarAlt
6494
+ }
6495
+ ),
6496
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_lucide_react14.ChevronDown, { size: 12, color: "#2f2f2f", strokeWidth: 2 })
6497
+ ]
6498
+ }
6499
+ ),
6500
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { style: dividerStyles }),
6501
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
6502
+ LogoSection,
6503
+ {
6504
+ style: {
6505
+ ...logoSectionStyles,
6506
+ ...onLogoClick ? { outline: "none", backgroundColor: "transparent", border: "none" } : {}
6507
+ },
6508
+ onClick: onLogoClick,
6509
+ ...onLogoClick ? { type: "button" } : {},
6510
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Logo, { withText: true, light: true, height: 25 })
6511
+ }
6512
+ )
6513
+ ]
6514
+ }
6515
+ );
6516
+ }
6517
+ );
6518
+ AvatarLogoLockup.displayName = "AvatarLogoLockup";
6519
+
6520
+ // src/TopNavItem/TopNavItem.tsx
6521
+ var React38 = __toESM(require("react"));
6522
+ var import_lucide_react15 = require("lucide-react");
6523
+ var import_jsx_runtime38 = require("react/jsx-runtime");
6524
+ var TopNavItem = React38.forwardRef(
6525
+ ({
6526
+ children,
6527
+ active = false,
6528
+ onClick,
6529
+ className,
6530
+ style
6531
+ }, ref) => {
6532
+ const [isHovered, setIsHovered] = React38.useState(false);
6533
+ const [isFocused, setIsFocused] = React38.useState(false);
6534
+ const textColor = active ? "#005700" : "#474747";
6535
+ const iconColor = active ? "#005700" : "#474747";
6536
+ const getBackgroundColor = () => {
6537
+ if (active) return "#f0faf3";
6538
+ if (isHovered) return "#f8f8f8";
6539
+ return "transparent";
6540
+ };
6541
+ const containerStyles6 = {
6542
+ display: "inline-flex",
6543
+ alignItems: "center",
6544
+ justifyContent: "center",
6545
+ gap: "4px",
6546
+ padding: "4px 8px",
6547
+ backgroundColor: getBackgroundColor(),
6548
+ borderRadius: "8px",
6549
+ border: "none",
6550
+ cursor: "pointer",
6551
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
6552
+ boxSizing: "border-box",
6553
+ transition: "background-color 0.15s ease-in-out",
6554
+ outline: "none",
6555
+ boxShadow: isFocused ? "0px 0px 0px 3px #3cad51" : "none",
6556
+ ...style
6557
+ };
6558
+ const textStyles3 = {
6559
+ fontSize: "13px",
6560
+ fontWeight: 600,
6561
+ color: textColor,
6562
+ lineHeight: 1.5,
6563
+ textAlign: "center",
6564
+ whiteSpace: "nowrap"
6565
+ };
6566
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
6567
+ "button",
6568
+ {
6569
+ ref,
6570
+ className,
6571
+ style: containerStyles6,
6572
+ onClick,
6573
+ onMouseEnter: () => setIsHovered(true),
6574
+ onMouseLeave: () => setIsHovered(false),
6575
+ onFocus: () => setIsFocused(true),
6576
+ onBlur: () => setIsFocused(false),
6577
+ type: "button",
6578
+ children: [
6579
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { style: textStyles3, children }),
6580
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react15.ChevronDown, { size: 12, color: iconColor, strokeWidth: 2 })
6581
+ ]
6582
+ }
6583
+ );
6584
+ }
6585
+ );
6586
+ TopNavItem.displayName = "TopNavItem";
6587
+
6588
+ // src/TopNavBar/TopNavBar.tsx
6589
+ var React39 = __toESM(require("react"));
6590
+ var import_lucide_react16 = require("lucide-react");
6591
+ var import_jsx_runtime39 = require("react/jsx-runtime");
6592
+ var TopNavBar = React39.forwardRef(
6593
+ ({
6594
+ schoolLogoSrc,
6595
+ schoolLogoAlt = "School logo",
6596
+ onSchoolLogoClick,
6597
+ navItems = [],
6598
+ onNavItemClick,
6599
+ searchValue = "",
6600
+ onSearchChange,
6601
+ onSearchSubmit,
6602
+ onSearchClear,
6603
+ actionButtonLabel = "Ask Arbor",
6604
+ onActionButtonClick,
6605
+ showActionButton = true,
6606
+ avatarSrc,
6607
+ avatarInitials,
6608
+ avatarAlt = "User avatar",
6609
+ onAvatarClick,
6610
+ onLogoClick,
6611
+ className,
6612
+ style
6613
+ }, ref) => {
6614
+ const containerStyles6 = {
6615
+ position: "fixed",
6616
+ top: 0,
6617
+ left: 0,
6618
+ right: 0,
6619
+ display: "flex",
6620
+ alignItems: "center",
6621
+ justifyContent: "space-between",
6622
+ padding: "4px 8px",
6623
+ backgroundColor: "#ffffff",
6624
+ boxShadow: "0px 1px 2px 0px rgba(0, 0, 0, 0.08)",
6625
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
6626
+ boxSizing: "border-box",
6627
+ zIndex: 1e3,
6628
+ height: "48px",
6629
+ ...style
6630
+ };
6631
+ const leftSectionStyles = {
6632
+ display: "flex",
6633
+ alignItems: "center",
6634
+ gap: "16px"
6635
+ };
6636
+ const schoolLogoContainerStyles = {
6637
+ display: "flex",
6638
+ alignItems: "center",
6639
+ justifyContent: "center",
6640
+ width: "64px",
6641
+ height: "40px",
6642
+ backgroundColor: "#ffffff",
6643
+ border: "1px solid #efefef",
6644
+ borderRadius: "8px",
6645
+ overflow: "hidden",
6646
+ padding: "2px",
6647
+ boxSizing: "border-box",
6648
+ cursor: onSchoolLogoClick ? "pointer" : "default"
6649
+ };
6650
+ const schoolLogoImageStyles = {
6651
+ maxWidth: "100%",
6652
+ maxHeight: "100%",
6653
+ objectFit: "contain"
6654
+ };
6655
+ const placeholderStyles = {
6656
+ width: "100%",
6657
+ height: "100%",
6658
+ display: "flex",
6659
+ alignItems: "center",
6660
+ justifyContent: "center",
6661
+ backgroundColor: "#f8f8f8",
6662
+ color: "#949494",
6663
+ fontSize: "10px",
6664
+ fontWeight: 500,
6665
+ textAlign: "center"
6666
+ };
6667
+ const navItemsGroupStyles = {
6668
+ display: "flex",
6669
+ alignItems: "center",
6670
+ gap: "8px"
6671
+ };
6672
+ const rightSectionStyles = {
6673
+ display: "flex",
6674
+ alignItems: "center",
6675
+ gap: "16px"
6676
+ };
6677
+ const actionButtonStyles2 = {
6678
+ display: "flex",
6679
+ alignItems: "center",
6680
+ gap: "8px"
6681
+ };
6682
+ const SchoolLogoElement = onSchoolLogoClick ? "button" : "div";
6683
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("nav", { ref, className, style: containerStyles6, children: [
6684
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { style: leftSectionStyles, children: [
6685
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
6686
+ SchoolLogoElement,
6687
+ {
6688
+ style: {
6689
+ ...schoolLogoContainerStyles,
6690
+ ...onSchoolLogoClick ? { outline: "none", border: "1px solid #efefef" } : {}
6691
+ },
6692
+ onClick: onSchoolLogoClick,
6693
+ ...onSchoolLogoClick ? { type: "button" } : {},
6694
+ children: schoolLogoSrc ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
6695
+ "img",
6696
+ {
6697
+ src: schoolLogoSrc,
6698
+ alt: schoolLogoAlt,
6699
+ style: schoolLogoImageStyles
6700
+ }
6701
+ ) : /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { style: placeholderStyles, children: "Logo" })
6702
+ }
6703
+ ),
6704
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { style: navItemsGroupStyles, children: navItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
6705
+ TopNavItem,
6706
+ {
6707
+ active: item.active,
6708
+ onClick: () => onNavItemClick?.(item),
6709
+ children: item.label
6710
+ },
6711
+ item.id
6712
+ )) })
6713
+ ] }),
6714
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { style: rightSectionStyles, children: [
6715
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
6716
+ SearchGlobal,
6717
+ {
6718
+ value: searchValue,
6719
+ onChange: onSearchChange,
6720
+ onSubmit: onSearchSubmit,
6721
+ onClear: onSearchClear
6722
+ }
6723
+ ),
6724
+ showActionButton && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
6725
+ Button,
6726
+ {
6727
+ variant: "secondary",
6728
+ size: "small",
6729
+ onClick: onActionButtonClick,
6730
+ style: actionButtonStyles2,
6731
+ children: [
6732
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_lucide_react16.Sparkles, { size: 16, strokeWidth: 2 }),
6733
+ actionButtonLabel
6734
+ ]
6735
+ }
6736
+ ),
6737
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
6738
+ AvatarLogoLockup,
6739
+ {
6740
+ avatarSrc,
6741
+ avatarInitials,
6742
+ avatarAlt,
6743
+ onAvatarClick,
6744
+ onLogoClick
6745
+ }
6746
+ )
6747
+ ] })
6748
+ ] });
6749
+ }
6750
+ );
6751
+ TopNavBar.displayName = "TopNavBar";
6411
6752
  // Annotate the CommonJS export names for ESM import in node:
6412
6753
  0 && (module.exports = {
6413
6754
  Avatar,
6755
+ AvatarLogoLockup,
6414
6756
  Banner,
6415
6757
  Breadcrumbs,
6416
6758
  Button,
@@ -6446,6 +6788,8 @@ ModalContent.displayName = "ModalContent";
6446
6788
  TextArea,
6447
6789
  Toast,
6448
6790
  Toggle,
6449
- Tooltip
6791
+ Tooltip,
6792
+ TopNavBar,
6793
+ TopNavItem
6450
6794
  });
6451
6795
  //# sourceMappingURL=index.js.map