@kollegioai/ui 0.1.0 → 0.1.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 @@
1
+ {"version":3,"sources":["../src/Tooltip.tsx"],"names":["React","TooltipPrimitive","jsx","jsxs","ChakraTooltip","Portal","useBreakpointValue","VStack","ReactMarkdown","children","Text","Link","Box"],"mappings":"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","file":"chunk-EBQK5NBX.js","sourcesContent":["import { Box, Link, Text, Tooltip as ChakraTooltip, Portal, VStack, useBreakpointValue } from '@chakra-ui/react';\nimport * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\n\ntype TooltipPositioning = NonNullable<ChakraTooltip.RootProps['positioning']>;\ntype TooltipPlacement = TooltipPositioning['placement'];\ntype TooltipOffset = TooltipPositioning['offset'];\n\nexport interface TooltipProps extends Omit<ChakraTooltip.RootProps, 'children' | 'open'> {\n children: React.ReactNode;\n showArrow?: boolean;\n hasArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement | null>;\n content?: React.ReactNode;\n label?: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n isDisabled?: boolean;\n open?: boolean;\n isOpen?: boolean;\n placement?: TooltipPlacement;\n offset?: TooltipOffset;\n closeOnClick?: boolean;\n fontSize?: ChakraTooltip.ContentProps['fontSize'];\n width?: ChakraTooltip.ContentProps['width'];\n w?: ChakraTooltip.ContentProps['w'];\n bg?: ChakraTooltip.ContentProps['bg'];\n color?: ChakraTooltip.ContentProps['color'];\n px?: ChakraTooltip.ContentProps['px'];\n py?: ChakraTooltip.ContentProps['py'];\n borderRadius?: ChakraTooltip.ContentProps['borderRadius'];\n boxShadow?: ChakraTooltip.ContentProps['boxShadow'];\n zIndex?: ChakraTooltip.ContentProps['zIndex'];\n alignSelf?: ChakraTooltip.ContentProps['alignSelf'];\n openOnClick?: boolean;\n clickOpenDurationMs?: number;\n fullWidthTrigger?: boolean;\n}\n\n/** Low-level Chakra v3 tooltip primitive. Prefer `Tooltip` (the markdown wrapper) for app usage. */\nexport const TooltipPrimitive = React.forwardRef<HTMLDivElement, TooltipProps>(function TooltipPrimitive(\n props,\n ref,\n) {\n const {\n showArrow,\n hasArrow,\n children,\n disabled,\n isDisabled,\n portalled = true,\n content,\n label,\n contentProps,\n portalRef,\n open,\n isOpen,\n placement,\n offset,\n closeOnClick,\n fontSize,\n width,\n w,\n bg,\n color,\n px,\n py,\n borderRadius,\n boxShadow,\n zIndex,\n alignSelf,\n openOnClick,\n clickOpenDurationMs = 900,\n fullWidthTrigger = false,\n openDelay = 0,\n closeDelay = 0,\n ...rest\n } = props;\n\n // Tap-to-open when hover is unreliable (phones, many tablets). iOS can still report `(hover: hover)`,\n // so rely on maxTouchPoints / coarse pointer — not hover alone.\n const shouldOpenTooltipOnClick =\n typeof window !== 'undefined' &&\n (navigator.maxTouchPoints > 0 ||\n window.matchMedia?.('(pointer: coarse)')?.matches === true ||\n window.matchMedia?.('(hover: none)')?.matches === true);\n const resolvedOpenOnClick = openOnClick ?? shouldOpenTooltipOnClick;\n\n const [manualOpen, setManualOpen] = React.useState(false);\n const manualOpenTimeoutRef = React.useRef<number | null>(null);\n const triggerRef = React.useRef<HTMLSpanElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n\n const clearManualOpenTimeout = React.useCallback(() => {\n if (manualOpenTimeoutRef.current !== null) {\n window.clearTimeout(manualOpenTimeoutRef.current);\n manualOpenTimeoutRef.current = null;\n }\n }, []);\n\n React.useEffect(\n () => () => {\n clearManualOpenTimeout();\n },\n [clearManualOpenTimeout],\n );\n\n // When opened via tap/click, close on any outside click/tap.\n React.useEffect(() => {\n if (!resolvedOpenOnClick || !manualOpen) return;\n\n const onPointerDownCapture = (e: PointerEvent) => {\n const t = e.target;\n if (!(t instanceof Node)) return;\n if (triggerRef.current?.contains(t)) return;\n if (contentRef.current?.contains(t)) return;\n setManualOpen(false);\n clearManualOpenTimeout();\n };\n\n document.addEventListener('pointerdown', onPointerDownCapture, true);\n return () => document.removeEventListener('pointerdown', onPointerDownCapture, true);\n }, [clearManualOpenTimeout, manualOpen, resolvedOpenOnClick]);\n\n const isTooltipDisabled = disabled ?? isDisabled ?? false;\n if (isTooltipDisabled) {\n return <>{children}</>;\n }\n\n const tooltipContent = content ?? label;\n if (!tooltipContent) {\n return <>{children}</>;\n }\n\n const positioning =\n placement !== undefined || offset !== undefined\n ? {\n ...(rest.positioning ?? {}),\n ...(placement !== undefined ? { placement } : {}),\n ...(offset !== undefined ? { offset } : {}),\n }\n : rest.positioning;\n\n const mergedContentProps: ChakraTooltip.ContentProps = {\n fontSize,\n width,\n w,\n bg,\n color,\n px,\n py,\n borderRadius,\n boxShadow,\n zIndex,\n alignSelf,\n ...contentProps,\n };\n\n const openTooltipOnClick = () => {\n if (!resolvedOpenOnClick) {\n return;\n }\n setManualOpen(true);\n clearManualOpenTimeout();\n manualOpenTimeoutRef.current = window.setTimeout(() => {\n setManualOpen(false);\n manualOpenTimeoutRef.current = null;\n }, clickOpenDurationMs);\n };\n\n const triggerChild = (\n <span\n ref={triggerRef}\n onClick={resolvedOpenOnClick ? openTooltipOnClick : undefined}\n style={{\n display: fullWidthTrigger ? 'flex' : 'inline-flex',\n width: fullWidthTrigger ? '100%' : undefined,\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: resolvedOpenOnClick && !fullWidthTrigger ? 44 : undefined,\n minHeight: resolvedOpenOnClick && !fullWidthTrigger ? 44 : undefined,\n cursor: 'pointer',\n WebkitTapHighlightColor: 'transparent',\n color: 'var(--chakra-colors-contentPrimaryStrong)',\n }}\n >\n {children}\n </span>\n );\n\n const rootProps: ChakraTooltip.RootProps = {\n ...rest,\n open: isOpen ?? open ?? (manualOpen ? true : undefined),\n openDelay,\n closeDelay,\n positioning,\n ...(closeOnClick === false ? { closeOnPointerDown: false } : {}),\n };\n\n return (\n <ChakraTooltip.Root {...rootProps}>\n <ChakraTooltip.Trigger asChild>{triggerChild}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n {...mergedContentProps}\n >\n {(showArrow || hasArrow) && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {tooltipContent}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n});\n\ninterface KollegioTooltipProps extends Omit<TooltipProps, 'content' | 'children'> {\n label?: string;\n children: React.ReactNode;\n}\n\n/** Brand tooltip: renders markdown `label`, tap-to-open on touch devices. */\nexport const Tooltip = ({ label, children, ...props }: KollegioTooltipProps) => {\n // On touch devices there is no hover; enable tap-to-open.\n const isTouch = useBreakpointValue({ base: true, lg: false }) ?? true;\n return (\n <TooltipPrimitive\n openOnClick={isTouch}\n // Give users time to read on mobile before auto-closing.\n clickOpenDurationMs={isTouch ? 2500 : undefined}\n content={\n label ? (\n <VStack align=\"start\" gap={2} maxW=\"280px\">\n <ReactMarkdown\n components={{\n p: ({ children }) => <Text color={'inherit'}>{children}</Text>,\n strong: ({ children }) => (\n <Text color={'inherit'} display=\"block\" asChild>\n <b>{children}</b>\n </Text>\n ),\n ul: ({ children }) => (\n <VStack as=\"ul\" align=\"start\" gap={1} pl={4}>\n {children}\n </VStack>\n ),\n li: ({ children }) => (\n <Text color={'inherit'} as=\"li\" ml={2} fontSize=\"sm\" lineHeight=\"short\">\n {children}\n </Text>\n ),\n a: ({ href, children }) => (\n <Link href={href ?? '#'} target=\"_blank\" color=\"blue.200\">\n {children}\n </Link>\n ),\n }}\n >\n {label}\n </ReactMarkdown>\n </VStack>\n ) : null\n }\n {...props}\n >\n <span>\n <Box as=\"span\" display=\"inline-block\" cursor=\"default\" _hover={{ cursor: 'pointer' }}>\n {children}\n </Box>\n </span>\n </TooltipPrimitive>\n );\n};\n\nexport default Tooltip;\n"]}
@@ -0,0 +1,184 @@
1
+ 'use strict';
2
+
3
+ var react$1 = require('@chakra-ui/react');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ // src/Button.tsx
8
+ var VARIANT_STYLES = {
9
+ primary: {
10
+ bg: "backgroundPrimary",
11
+ color: "white",
12
+ border: "1px solid",
13
+ borderColor: "borderBrandOpacity30",
14
+ _hover: { bg: "backgroundPrimarySubtle" }
15
+ },
16
+ primaryStrong: {
17
+ bg: "contentPrimaryStrong",
18
+ color: "white",
19
+ border: "1px solid",
20
+ borderColor: "borderBrandOpacity30",
21
+ _hover: { bg: "backgroundPrimarySubtle" },
22
+ _active: { bg: "backgroundPrimarySubtle" }
23
+ },
24
+ accent: {
25
+ bg: "backgroundAIAccent",
26
+ color: "white",
27
+ border: "1px solid",
28
+ borderColor: "borderBrandOpacity30",
29
+ _hover: { bg: "backgroundAIAccent", opacity: 0.65 }
30
+ },
31
+ outline: {
32
+ bg: "white",
33
+ border: "1px solid",
34
+ borderColor: "borderBrand",
35
+ color: "contentPrimaryStrong",
36
+ _hover: { bg: "white", borderColor: "borderBrand" }
37
+ },
38
+ secondary: {
39
+ bg: "backgroundSuccessAccent",
40
+ color: "contentPrimaryStrong",
41
+ border: "1px solid",
42
+ borderColor: "borderBrandOpacity30",
43
+ _hover: { bg: "backgroundBase3" }
44
+ },
45
+ tertiary: {
46
+ display: "flex",
47
+ gap: "16px",
48
+ alignItems: "center",
49
+ border: "none",
50
+ background: "none",
51
+ padding: "unset",
52
+ color: "contentPrimarySubtle",
53
+ fontSize: "14px",
54
+ _hover: { border: "none", background: "none", textDecoration: "underline" }
55
+ },
56
+ light: {
57
+ color: "contentPrimary",
58
+ background: "white",
59
+ border: "1px solid",
60
+ borderColor: "borderSecondary",
61
+ _hover: { background: "gray.50", borderColor: "borderSecondary" }
62
+ },
63
+ ghost: {
64
+ bg: "transparent",
65
+ color: "contentPrimaryStrong",
66
+ border: "none",
67
+ boxShadow: "none",
68
+ _hover: { bg: "transparent" }
69
+ },
70
+ oauth: {
71
+ bg: "white",
72
+ color: "primaryDark",
73
+ border: "1px solid",
74
+ borderColor: "borderSecondary",
75
+ borderRadius: "8px",
76
+ _hover: { borderColor: "borderBrand" }
77
+ },
78
+ logOut: {
79
+ border: "1px solid",
80
+ borderRadius: "xl",
81
+ borderColor: "black",
82
+ color: "black",
83
+ bg: "backgroundBase2",
84
+ _hover: { bg: "#FFE6E4" }
85
+ }
86
+ };
87
+ var SIZE_STYLES = {
88
+ sm: {
89
+ h: "26px",
90
+ minH: "26px",
91
+ px: "10px",
92
+ fontSize: "12px",
93
+ lineHeight: "150%",
94
+ borderRadius: "6px"
95
+ },
96
+ md: {
97
+ h: "auto",
98
+ minH: "unset",
99
+ py: "8px",
100
+ px: "12px",
101
+ fontSize: "14px",
102
+ lineHeight: "140%",
103
+ borderRadius: "4px"
104
+ },
105
+ lg: {
106
+ h: "40px",
107
+ minH: "40px",
108
+ py: "12px",
109
+ px: "12px",
110
+ fontSize: "14px",
111
+ lineHeight: "140%",
112
+ borderRadius: "8px"
113
+ }
114
+ };
115
+ var Button = react.forwardRef(function Button2({
116
+ variant = "primary",
117
+ buttonSize,
118
+ fullWidth,
119
+ isLoading,
120
+ leftIcon,
121
+ rightIcon,
122
+ children,
123
+ display,
124
+ alignItems,
125
+ gap,
126
+ flexShrink,
127
+ w,
128
+ width,
129
+ enableTouchEndClickFix = false,
130
+ disabled,
131
+ onClick,
132
+ onTouchEnd,
133
+ ...rest
134
+ }, ref) {
135
+ const hasIcons = Boolean(leftIcon || rightIcon);
136
+ const didFireTouchRef = react.useRef(false);
137
+ const resolvedButtonSize = buttonSize ?? (variant === "oauth" ? void 0 : "md");
138
+ const handleTouchEnd = enableTouchEndClickFix ? (e) => {
139
+ onTouchEnd?.(e);
140
+ if (disabled) return;
141
+ e.preventDefault();
142
+ didFireTouchRef.current = true;
143
+ onClick?.(e);
144
+ } : onTouchEnd;
145
+ const handleClick = (e) => {
146
+ if (enableTouchEndClickFix && didFireTouchRef.current) {
147
+ didFireTouchRef.current = false;
148
+ return;
149
+ }
150
+ onClick?.(e);
151
+ };
152
+ return /* @__PURE__ */ jsxRuntime.jsxs(
153
+ react$1.Button,
154
+ {
155
+ ref,
156
+ type: "button",
157
+ variant: "solid",
158
+ loading: isLoading,
159
+ disabled,
160
+ onClick: handleClick,
161
+ onTouchEnd: handleTouchEnd,
162
+ display: display ?? (hasIcons ? "inline-flex" : void 0),
163
+ alignItems: alignItems ?? (hasIcons ? "center" : void 0),
164
+ gap: gap ?? (hasIcons ? "4px" : void 0),
165
+ flexShrink: flexShrink ?? 0,
166
+ w: w ?? width ?? (fullWidth ? "full" : void 0),
167
+ width: width ?? (fullWidth && w == null ? "full" : void 0),
168
+ ...VARIANT_STYLES[variant],
169
+ ...resolvedButtonSize ? SIZE_STYLES[resolvedButtonSize] : {},
170
+ ...rest,
171
+ children: [
172
+ leftIcon,
173
+ children,
174
+ rightIcon
175
+ ]
176
+ }
177
+ );
178
+ });
179
+ var Button_default = Button;
180
+
181
+ exports.Button = Button;
182
+ exports.Button_default = Button_default;
183
+ //# sourceMappingURL=chunk-Q4T6BIJ6.js.map
184
+ //# sourceMappingURL=chunk-Q4T6BIJ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Button.tsx"],"names":["forwardRef","Button","useRef","jsxs","ChakraButton"],"mappings":";;;;;;;AAyBA,IAAM,cAA6D,GAAA;AAAA,EACjE,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,mBAAA;AAAA,IACJ,KAAO,EAAA,OAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,sBAAA;AAAA,IACb,MAAA,EAAQ,EAAE,EAAA,EAAI,yBAA0B;AAAA,GAC1C;AAAA,EACA,aAAe,EAAA;AAAA,IACb,EAAI,EAAA,sBAAA;AAAA,IACJ,KAAO,EAAA,OAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,sBAAA;AAAA,IACb,MAAA,EAAQ,EAAE,EAAA,EAAI,yBAA0B,EAAA;AAAA,IACxC,OAAA,EAAS,EAAE,EAAA,EAAI,yBAA0B;AAAA,GAC3C;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,EAAI,EAAA,oBAAA;AAAA,IACJ,KAAO,EAAA,OAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,sBAAA;AAAA,IACb,MAAQ,EAAA,EAAE,EAAI,EAAA,oBAAA,EAAsB,SAAS,IAAK;AAAA,GACpD;AAAA,EACA,OAAS,EAAA;AAAA,IACP,EAAI,EAAA,OAAA;AAAA,IACJ,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,aAAA;AAAA,IACb,KAAO,EAAA,sBAAA;AAAA,IACP,MAAQ,EAAA,EAAE,EAAI,EAAA,OAAA,EAAS,aAAa,aAAc;AAAA,GACpD;AAAA,EACA,SAAW,EAAA;AAAA,IACT,EAAI,EAAA,yBAAA;AAAA,IACJ,KAAO,EAAA,sBAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,sBAAA;AAAA,IACb,MAAA,EAAQ,EAAE,EAAA,EAAI,iBAAkB;AAAA,GAClC;AAAA,EACA,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,MAAA;AAAA,IACT,GAAK,EAAA,MAAA;AAAA,IACL,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA,MAAA;AAAA,IACR,UAAY,EAAA,MAAA;AAAA,IACZ,OAAS,EAAA,OAAA;AAAA,IACT,KAAO,EAAA,sBAAA;AAAA,IACP,QAAU,EAAA,MAAA;AAAA,IACV,QAAQ,EAAE,MAAA,EAAQ,QAAQ,UAAY,EAAA,MAAA,EAAQ,gBAAgB,WAAY;AAAA,GAC5E;AAAA,EACA,KAAO,EAAA;AAAA,IACL,KAAO,EAAA,gBAAA;AAAA,IACP,UAAY,EAAA,OAAA;AAAA,IACZ,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,iBAAA;AAAA,IACb,MAAQ,EAAA,EAAE,UAAY,EAAA,SAAA,EAAW,aAAa,iBAAkB;AAAA,GAClE;AAAA,EACA,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,aAAA;AAAA,IACJ,KAAO,EAAA,sBAAA;AAAA,IACP,MAAQ,EAAA,MAAA;AAAA,IACR,SAAW,EAAA,MAAA;AAAA,IACX,MAAA,EAAQ,EAAE,EAAA,EAAI,aAAc;AAAA,GAC9B;AAAA,EACA,KAAO,EAAA;AAAA,IACL,EAAI,EAAA,OAAA;AAAA,IACJ,KAAO,EAAA,aAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,iBAAA;AAAA,IACb,YAAc,EAAA,KAAA;AAAA,IACd,MAAA,EAAQ,EAAE,WAAA,EAAa,aAAc;AAAA,GACvC;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,WAAA;AAAA,IACR,YAAc,EAAA,IAAA;AAAA,IACd,WAAa,EAAA,OAAA;AAAA,IACb,KAAO,EAAA,OAAA;AAAA,IACP,EAAI,EAAA,iBAAA;AAAA,IACJ,MAAA,EAAQ,EAAE,EAAA,EAAI,SAAU;AAAA;AAE5B,CAAA;AAEA,IAAM,WAAuD,GAAA;AAAA,EAC3D,EAAI,EAAA;AAAA,IACF,CAAG,EAAA,MAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,IACN,EAAI,EAAA,MAAA;AAAA,IACJ,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,EAAI,EAAA;AAAA,IACF,CAAG,EAAA,MAAA;AAAA,IACH,IAAM,EAAA,OAAA;AAAA,IACN,EAAI,EAAA,KAAA;AAAA,IACJ,EAAI,EAAA,MAAA;AAAA,IACJ,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,EAAI,EAAA;AAAA,IACF,CAAG,EAAA,MAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,IACN,EAAI,EAAA,MAAA;AAAA,IACJ,EAAI,EAAA,MAAA;AAAA,IACJ,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,YAAc,EAAA;AAAA;AAElB,CAAA;AAca,IAAA,MAAA,GAASA,gBAAmD,CAAA,SAASC,OAChF,CAAA;AAAA,EACE,OAAU,GAAA,SAAA;AAAA,EACV,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAA;AAAA,EACA,UAAA;AAAA,EACA,CAAA;AAAA,EACA,KAAA;AAAA,EACA,sBAAyB,GAAA,KAAA;AAAA,EACzB,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GACA,EAAA;AACA,EAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,QAAA,IAAY,SAAS,CAAA;AAC9C,EAAM,MAAA,eAAA,GAAkBC,aAAO,KAAK,CAAA;AACpC,EAAA,MAAM,kBAAqB,GAAA,UAAA,KAAe,OAAY,KAAA,OAAA,GAAU,MAAY,GAAA,IAAA,CAAA;AAE5E,EAAM,MAAA,cAAA,GAA4C,sBAC9C,GAAA,CAAC,CAAM,KAAA;AACL,IAAA,UAAA,GAAa,CAAC,CAAA;AACd,IAAA,IAAI,QAAU,EAAA;AACd,IAAA,CAAA,CAAE,cAAe,EAAA;AACjB,IAAA,eAAA,CAAgB,OAAU,GAAA,IAAA;AAC1B,IAAA,OAAA,GAAU,CAA6C,CAAA;AAAA,GAEzD,GAAA,UAAA;AAEJ,EAAM,MAAA,WAAA,GAAsC,CAAC,CAAM,KAAA;AACjD,IAAI,IAAA,sBAAA,IAA0B,gBAAgB,OAAS,EAAA;AACrD,MAAA,eAAA,CAAgB,OAAU,GAAA,KAAA;AAC1B,MAAA;AAAA;AAEF,IAAA,OAAA,GAAU,CAAC,CAAA;AAAA,GACb;AAEA,EACE,uBAAAC,eAAA;AAAA,IAACC,cAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,OAAQ,EAAA,OAAA;AAAA,MACR,OAAS,EAAA,SAAA;AAAA,MACT,QAAA;AAAA,MACA,OAAS,EAAA,WAAA;AAAA,MACT,UAAY,EAAA,cAAA;AAAA,MACZ,OAAA,EAAS,OAAY,KAAA,QAAA,GAAW,aAAgB,GAAA,MAAA,CAAA;AAAA,MAChD,UAAA,EAAY,UAAe,KAAA,QAAA,GAAW,QAAW,GAAA,MAAA,CAAA;AAAA,MACjD,GAAA,EAAK,GAAQ,KAAA,QAAA,GAAW,KAAQ,GAAA,MAAA,CAAA;AAAA,MAChC,YAAY,UAAc,IAAA,CAAA;AAAA,MAC1B,CAAG,EAAA,CAAA,IAAK,KAAU,KAAA,SAAA,GAAY,MAAS,GAAA,MAAA,CAAA;AAAA,MACvC,KAAO,EAAA,KAAA,KAAU,SAAa,IAAA,CAAA,IAAK,OAAO,MAAS,GAAA,MAAA,CAAA;AAAA,MAClD,GAAG,eAAe,OAAO,CAAA;AAAA,MACzB,GAAI,kBAAA,GAAqB,WAAY,CAAA,kBAAkB,IAAI,EAAC;AAAA,MAC5D,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,IAAO,cAAQ,GAAA","file":"chunk-Q4T6BIJ6.js","sourcesContent":["import { Button as ChakraButton, type ButtonProps } from '@chakra-ui/react';\nimport { forwardRef, useRef, type MouseEvent, type ReactNode } from 'react';\n\n/**\n * Variant set merged from both product apps:\n * - client-src: primary, primaryStrong, accent, outline, secondary, ghost, oauth, logOut\n * - counsellor: tertiary, light (its \"secondary\" mapped to `outline`)\n *\n * Components reference kollegio token NAMES (e.g. `backgroundPrimary`). The consuming\n * app's Chakra `createSystem` must include the @kollegioai/tokens colors.\n */\nexport type KollegioButtonVariant =\n | 'primary'\n | 'primaryStrong'\n | 'accent'\n | 'outline'\n | 'secondary'\n | 'tertiary'\n | 'light'\n | 'ghost'\n | 'oauth'\n | 'logOut';\n\nexport type KollegioButtonSize = 'sm' | 'md' | 'lg';\n\nconst VARIANT_STYLES: Record<KollegioButtonVariant, ButtonProps> = {\n primary: {\n bg: 'backgroundPrimary',\n color: 'white',\n border: '1px solid',\n borderColor: 'borderBrandOpacity30',\n _hover: { bg: 'backgroundPrimarySubtle' },\n },\n primaryStrong: {\n bg: 'contentPrimaryStrong',\n color: 'white',\n border: '1px solid',\n borderColor: 'borderBrandOpacity30',\n _hover: { bg: 'backgroundPrimarySubtle' },\n _active: { bg: 'backgroundPrimarySubtle' },\n },\n accent: {\n bg: 'backgroundAIAccent',\n color: 'white',\n border: '1px solid',\n borderColor: 'borderBrandOpacity30',\n _hover: { bg: 'backgroundAIAccent', opacity: 0.65 },\n },\n outline: {\n bg: 'white',\n border: '1px solid',\n borderColor: 'borderBrand',\n color: 'contentPrimaryStrong',\n _hover: { bg: 'white', borderColor: 'borderBrand' },\n },\n secondary: {\n bg: 'backgroundSuccessAccent',\n color: 'contentPrimaryStrong',\n border: '1px solid',\n borderColor: 'borderBrandOpacity30',\n _hover: { bg: 'backgroundBase3' },\n },\n tertiary: {\n display: 'flex',\n gap: '16px',\n alignItems: 'center',\n border: 'none',\n background: 'none',\n padding: 'unset',\n color: 'contentPrimarySubtle',\n fontSize: '14px',\n _hover: { border: 'none', background: 'none', textDecoration: 'underline' },\n },\n light: {\n color: 'contentPrimary',\n background: 'white',\n border: '1px solid',\n borderColor: 'borderSecondary',\n _hover: { background: 'gray.50', borderColor: 'borderSecondary' },\n },\n ghost: {\n bg: 'transparent',\n color: 'contentPrimaryStrong',\n border: 'none',\n boxShadow: 'none',\n _hover: { bg: 'transparent' },\n },\n oauth: {\n bg: 'white',\n color: 'primaryDark',\n border: '1px solid',\n borderColor: 'borderSecondary',\n borderRadius: '8px',\n _hover: { borderColor: 'borderBrand' },\n },\n logOut: {\n border: '1px solid',\n borderRadius: 'xl',\n borderColor: 'black',\n color: 'black',\n bg: 'backgroundBase2',\n _hover: { bg: '#FFE6E4' },\n },\n};\n\nconst SIZE_STYLES: Record<KollegioButtonSize, ButtonProps> = {\n sm: {\n h: '26px',\n minH: '26px',\n px: '10px',\n fontSize: '12px',\n lineHeight: '150%',\n borderRadius: '6px',\n },\n md: {\n h: 'auto',\n minH: 'unset',\n py: '8px',\n px: '12px',\n fontSize: '14px',\n lineHeight: '140%',\n borderRadius: '4px',\n },\n lg: {\n h: '40px',\n minH: '40px',\n py: '12px',\n px: '12px',\n fontSize: '14px',\n lineHeight: '140%',\n borderRadius: '8px',\n },\n};\n\nexport type KollegioButtonProps = Omit<ButtonProps, 'variant'> & {\n variant?: KollegioButtonVariant;\n /** Kollegio sizing preset — not Chakra's `size` prop. */\n buttonSize?: KollegioButtonSize;\n fullWidth?: boolean;\n isLoading?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n /** iOS Safari: fire on touchend so fixed/mobile CTAs respond reliably. */\n enableTouchEndClickFix?: boolean;\n};\n\nexport const Button = forwardRef<HTMLButtonElement, KollegioButtonProps>(function Button(\n {\n variant = 'primary',\n buttonSize,\n fullWidth,\n isLoading,\n leftIcon,\n rightIcon,\n children,\n display,\n alignItems,\n gap,\n flexShrink,\n w,\n width,\n enableTouchEndClickFix = false,\n disabled,\n onClick,\n onTouchEnd,\n ...rest\n },\n ref,\n) {\n const hasIcons = Boolean(leftIcon || rightIcon);\n const didFireTouchRef = useRef(false);\n const resolvedButtonSize = buttonSize ?? (variant === 'oauth' ? undefined : 'md');\n\n const handleTouchEnd: ButtonProps['onTouchEnd'] = enableTouchEndClickFix\n ? (e) => {\n onTouchEnd?.(e);\n if (disabled) return;\n e.preventDefault();\n didFireTouchRef.current = true;\n onClick?.(e as unknown as MouseEvent<HTMLButtonElement>);\n }\n : onTouchEnd;\n\n const handleClick: ButtonProps['onClick'] = (e) => {\n if (enableTouchEndClickFix && didFireTouchRef.current) {\n didFireTouchRef.current = false;\n return;\n }\n onClick?.(e);\n };\n\n return (\n <ChakraButton\n ref={ref}\n type=\"button\"\n variant=\"solid\"\n loading={isLoading}\n disabled={disabled}\n onClick={handleClick}\n onTouchEnd={handleTouchEnd}\n display={display ?? (hasIcons ? 'inline-flex' : undefined)}\n alignItems={alignItems ?? (hasIcons ? 'center' : undefined)}\n gap={gap ?? (hasIcons ? '4px' : undefined)}\n flexShrink={flexShrink ?? 0}\n w={w ?? width ?? (fullWidth ? 'full' : undefined)}\n width={width ?? (fullWidth && w == null ? 'full' : undefined)}\n {...VARIANT_STYLES[variant]}\n {...(resolvedButtonSize ? SIZE_STYLES[resolvedButtonSize] : {})}\n {...rest}\n >\n {leftIcon}\n {children}\n {rightIcon}\n </ChakraButton>\n );\n});\n\nexport default Button;\n"]}
@@ -0,0 +1,186 @@
1
+ import { Tooltip as Tooltip$1, Portal, useBreakpointValue, Box, VStack, Link, Text } from '@chakra-ui/react';
2
+ import * as React from 'react';
3
+ import ReactMarkdown from 'react-markdown';
4
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
5
+
6
+ // src/Tooltip.tsx
7
+ var TooltipPrimitive = React.forwardRef(function TooltipPrimitive2(props, ref) {
8
+ const {
9
+ showArrow,
10
+ hasArrow,
11
+ children,
12
+ disabled,
13
+ isDisabled,
14
+ portalled = true,
15
+ content,
16
+ label,
17
+ contentProps,
18
+ portalRef,
19
+ open,
20
+ isOpen,
21
+ placement,
22
+ offset,
23
+ closeOnClick,
24
+ fontSize,
25
+ width,
26
+ w,
27
+ bg,
28
+ color,
29
+ px,
30
+ py,
31
+ borderRadius,
32
+ boxShadow,
33
+ zIndex,
34
+ alignSelf,
35
+ openOnClick,
36
+ clickOpenDurationMs = 900,
37
+ fullWidthTrigger = false,
38
+ openDelay = 0,
39
+ closeDelay = 0,
40
+ ...rest
41
+ } = props;
42
+ const shouldOpenTooltipOnClick = typeof window !== "undefined" && (navigator.maxTouchPoints > 0 || window.matchMedia?.("(pointer: coarse)")?.matches === true || window.matchMedia?.("(hover: none)")?.matches === true);
43
+ const resolvedOpenOnClick = openOnClick ?? shouldOpenTooltipOnClick;
44
+ const [manualOpen, setManualOpen] = React.useState(false);
45
+ const manualOpenTimeoutRef = React.useRef(null);
46
+ const triggerRef = React.useRef(null);
47
+ const contentRef = React.useRef(null);
48
+ const clearManualOpenTimeout = React.useCallback(() => {
49
+ if (manualOpenTimeoutRef.current !== null) {
50
+ window.clearTimeout(manualOpenTimeoutRef.current);
51
+ manualOpenTimeoutRef.current = null;
52
+ }
53
+ }, []);
54
+ React.useEffect(
55
+ () => () => {
56
+ clearManualOpenTimeout();
57
+ },
58
+ [clearManualOpenTimeout]
59
+ );
60
+ React.useEffect(() => {
61
+ if (!resolvedOpenOnClick || !manualOpen) return;
62
+ const onPointerDownCapture = (e) => {
63
+ const t = e.target;
64
+ if (!(t instanceof Node)) return;
65
+ if (triggerRef.current?.contains(t)) return;
66
+ if (contentRef.current?.contains(t)) return;
67
+ setManualOpen(false);
68
+ clearManualOpenTimeout();
69
+ };
70
+ document.addEventListener("pointerdown", onPointerDownCapture, true);
71
+ return () => document.removeEventListener("pointerdown", onPointerDownCapture, true);
72
+ }, [clearManualOpenTimeout, manualOpen, resolvedOpenOnClick]);
73
+ const isTooltipDisabled = disabled ?? isDisabled ?? false;
74
+ if (isTooltipDisabled) {
75
+ return /* @__PURE__ */ jsx(Fragment, { children });
76
+ }
77
+ const tooltipContent = content ?? label;
78
+ if (!tooltipContent) {
79
+ return /* @__PURE__ */ jsx(Fragment, { children });
80
+ }
81
+ const positioning = placement !== void 0 || offset !== void 0 ? {
82
+ ...rest.positioning ?? {},
83
+ ...placement !== void 0 ? { placement } : {},
84
+ ...offset !== void 0 ? { offset } : {}
85
+ } : rest.positioning;
86
+ const mergedContentProps = {
87
+ fontSize,
88
+ width,
89
+ w,
90
+ bg,
91
+ color,
92
+ px,
93
+ py,
94
+ borderRadius,
95
+ boxShadow,
96
+ zIndex,
97
+ alignSelf,
98
+ ...contentProps
99
+ };
100
+ const openTooltipOnClick = () => {
101
+ if (!resolvedOpenOnClick) {
102
+ return;
103
+ }
104
+ setManualOpen(true);
105
+ clearManualOpenTimeout();
106
+ manualOpenTimeoutRef.current = window.setTimeout(() => {
107
+ setManualOpen(false);
108
+ manualOpenTimeoutRef.current = null;
109
+ }, clickOpenDurationMs);
110
+ };
111
+ const triggerChild = /* @__PURE__ */ jsx(
112
+ "span",
113
+ {
114
+ ref: triggerRef,
115
+ onClick: resolvedOpenOnClick ? openTooltipOnClick : void 0,
116
+ style: {
117
+ display: fullWidthTrigger ? "flex" : "inline-flex",
118
+ width: fullWidthTrigger ? "100%" : void 0,
119
+ alignItems: "center",
120
+ justifyContent: "center",
121
+ minWidth: resolvedOpenOnClick && !fullWidthTrigger ? 44 : void 0,
122
+ minHeight: resolvedOpenOnClick && !fullWidthTrigger ? 44 : void 0,
123
+ cursor: "pointer",
124
+ WebkitTapHighlightColor: "transparent",
125
+ color: "var(--chakra-colors-contentPrimaryStrong)"
126
+ },
127
+ children
128
+ }
129
+ );
130
+ const rootProps = {
131
+ ...rest,
132
+ open: isOpen ?? open ?? (manualOpen ? true : void 0),
133
+ openDelay,
134
+ closeDelay,
135
+ positioning,
136
+ ...closeOnClick === false ? { closeOnPointerDown: false } : {}
137
+ };
138
+ return /* @__PURE__ */ jsxs(Tooltip$1.Root, { ...rootProps, children: [
139
+ /* @__PURE__ */ jsx(Tooltip$1.Trigger, { asChild: true, children: triggerChild }),
140
+ /* @__PURE__ */ jsx(Portal, { disabled: !portalled, container: portalRef, children: /* @__PURE__ */ jsx(Tooltip$1.Positioner, { children: /* @__PURE__ */ jsxs(
141
+ Tooltip$1.Content,
142
+ {
143
+ ref: (node) => {
144
+ contentRef.current = node;
145
+ if (typeof ref === "function") ref(node);
146
+ else if (ref) ref.current = node;
147
+ },
148
+ ...mergedContentProps,
149
+ children: [
150
+ (showArrow || hasArrow) && /* @__PURE__ */ jsx(Tooltip$1.Arrow, { children: /* @__PURE__ */ jsx(Tooltip$1.ArrowTip, {}) }),
151
+ tooltipContent
152
+ ]
153
+ }
154
+ ) }) })
155
+ ] });
156
+ });
157
+ var Tooltip = ({ label, children, ...props }) => {
158
+ const isTouch = useBreakpointValue({ base: true, lg: false }) ?? true;
159
+ return /* @__PURE__ */ jsx(
160
+ TooltipPrimitive,
161
+ {
162
+ openOnClick: isTouch,
163
+ clickOpenDurationMs: isTouch ? 2500 : void 0,
164
+ content: label ? /* @__PURE__ */ jsx(VStack, { align: "start", gap: 2, maxW: "280px", children: /* @__PURE__ */ jsx(
165
+ ReactMarkdown,
166
+ {
167
+ components: {
168
+ p: ({ children: children2 }) => /* @__PURE__ */ jsx(Text, { color: "inherit", children: children2 }),
169
+ strong: ({ children: children2 }) => /* @__PURE__ */ jsx(Text, { color: "inherit", display: "block", asChild: true, children: /* @__PURE__ */ jsx("b", { children: children2 }) }),
170
+ ul: ({ children: children2 }) => /* @__PURE__ */ jsx(VStack, { as: "ul", align: "start", gap: 1, pl: 4, children: children2 }),
171
+ li: ({ children: children2 }) => /* @__PURE__ */ jsx(Text, { color: "inherit", as: "li", ml: 2, fontSize: "sm", lineHeight: "short", children: children2 }),
172
+ a: ({ href, children: children2 }) => /* @__PURE__ */ jsx(Link, { href: href ?? "#", target: "_blank", color: "blue.200", children: children2 })
173
+ },
174
+ children: label
175
+ }
176
+ ) }) : null,
177
+ ...props,
178
+ children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(Box, { as: "span", display: "inline-block", cursor: "default", _hover: { cursor: "pointer" }, children }) })
179
+ }
180
+ );
181
+ };
182
+ var Tooltip_default = Tooltip;
183
+
184
+ export { Tooltip, TooltipPrimitive, Tooltip_default };
185
+ //# sourceMappingURL=chunk-RFUSESWB.mjs.map
186
+ //# sourceMappingURL=chunk-RFUSESWB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Tooltip.tsx"],"names":["TooltipPrimitive","ChakraTooltip","children"],"mappings":";;;;;;AAyCO,IAAM,gBAAyB,GAAA,KAAA,CAAA,UAAA,CAAyC,SAASA,iBAAAA,CACtF,OACA,GACA,EAAA;AACA,EAAM,MAAA;AAAA,IACJ,SAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAY,GAAA,IAAA;AAAA,IACZ,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,mBAAsB,GAAA,GAAA;AAAA,IACtB,gBAAmB,GAAA,KAAA;AAAA,IACnB,SAAY,GAAA,CAAA;AAAA,IACZ,UAAa,GAAA,CAAA;AAAA,IACb,GAAG;AAAA,GACD,GAAA,KAAA;AAIJ,EAAA,MAAM,2BACJ,OAAO,MAAA,KAAW,WACjB,KAAA,SAAA,CAAU,iBAAiB,CAC1B,IAAA,MAAA,CAAO,UAAa,GAAA,mBAAmB,GAAG,OAAY,KAAA,IAAA,IACtD,OAAO,UAAa,GAAA,eAAe,GAAG,OAAY,KAAA,IAAA,CAAA;AACtD,EAAA,MAAM,sBAAsB,WAAe,IAAA,wBAAA;AAE3C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAU,eAAS,KAAK,CAAA;AACxD,EAAM,MAAA,oBAAA,GAA6B,aAAsB,IAAI,CAAA;AAC7D,EAAM,MAAA,UAAA,GAAmB,aAA+B,IAAI,CAAA;AAC5D,EAAM,MAAA,UAAA,GAAmB,aAA8B,IAAI,CAAA;AAE3D,EAAM,MAAA,sBAAA,GAA+B,kBAAY,MAAM;AACrD,IAAI,IAAA,oBAAA,CAAqB,YAAY,IAAM,EAAA;AACzC,MAAO,MAAA,CAAA,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAChD,MAAA,oBAAA,CAAqB,OAAU,GAAA,IAAA;AAAA;AACjC,GACF,EAAG,EAAE,CAAA;AAEL,EAAM,KAAA,CAAA,SAAA;AAAA,IACJ,MAAM,MAAM;AACV,MAAuB,sBAAA,EAAA;AAAA,KACzB;AAAA,IACA,CAAC,sBAAsB;AAAA,GACzB;AAGA,EAAM,gBAAU,MAAM;AACpB,IAAI,IAAA,CAAC,mBAAuB,IAAA,CAAC,UAAY,EAAA;AAEzC,IAAM,MAAA,oBAAA,GAAuB,CAAC,CAAoB,KAAA;AAChD,MAAA,MAAM,IAAI,CAAE,CAAA,MAAA;AACZ,MAAI,IAAA,EAAE,aAAa,IAAO,CAAA,EAAA;AAC1B,MAAA,IAAI,UAAW,CAAA,OAAA,EAAS,QAAS,CAAA,CAAC,CAAG,EAAA;AACrC,MAAA,IAAI,UAAW,CAAA,OAAA,EAAS,QAAS,CAAA,CAAC,CAAG,EAAA;AACrC,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAuB,sBAAA,EAAA;AAAA,KACzB;AAEA,IAAS,QAAA,CAAA,gBAAA,CAAiB,aAAe,EAAA,oBAAA,EAAsB,IAAI,CAAA;AACnE,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAoB,CAAA,aAAA,EAAe,sBAAsB,IAAI,CAAA;AAAA,GAClF,EAAA,CAAC,sBAAwB,EAAA,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAE5D,EAAM,MAAA,iBAAA,GAAoB,YAAY,UAAc,IAAA,KAAA;AACpD,EAAA,IAAI,iBAAmB,EAAA;AACrB,IAAA,uCAAU,QAAS,EAAA,CAAA;AAAA;AAGrB,EAAA,MAAM,iBAAiB,OAAW,IAAA,KAAA;AAClC,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAA,uCAAU,QAAS,EAAA,CAAA;AAAA;AAGrB,EAAA,MAAM,WACJ,GAAA,SAAA,KAAc,MAAa,IAAA,MAAA,KAAW,MAClC,GAAA;AAAA,IACE,GAAI,IAAK,CAAA,WAAA,IAAe,EAAC;AAAA,IACzB,GAAI,SAAc,KAAA,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IAC/C,GAAI,MAAW,KAAA,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,MAE3C,IAAK,CAAA,WAAA;AAEX,EAAA,MAAM,kBAAiD,GAAA;AAAA,IACrD,QAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAA;AAAA,IACA,EAAA;AAAA,IACA,KAAA;AAAA,IACA,EAAA;AAAA,IACA,EAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAG;AAAA,GACL;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,MAAA;AAAA;AAEF,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAuB,sBAAA,EAAA;AACvB,IAAqB,oBAAA,CAAA,OAAA,GAAU,MAAO,CAAA,UAAA,CAAW,MAAM;AACrD,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,oBAAA,CAAqB,OAAU,GAAA,IAAA;AAAA,OAC9B,mBAAmB,CAAA;AAAA,GACxB;AAEA,EAAA,MAAM,YACJ,mBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,UAAA;AAAA,MACL,OAAA,EAAS,sBAAsB,kBAAqB,GAAA,MAAA;AAAA,MACpD,KAAO,EAAA;AAAA,QACL,OAAA,EAAS,mBAAmB,MAAS,GAAA,aAAA;AAAA,QACrC,KAAA,EAAO,mBAAmB,MAAS,GAAA,MAAA;AAAA,QACnC,UAAY,EAAA,QAAA;AAAA,QACZ,cAAgB,EAAA,QAAA;AAAA,QAChB,QAAU,EAAA,mBAAA,IAAuB,CAAC,gBAAA,GAAmB,EAAK,GAAA,MAAA;AAAA,QAC1D,SAAW,EAAA,mBAAA,IAAuB,CAAC,gBAAA,GAAmB,EAAK,GAAA,MAAA;AAAA,QAC3D,MAAQ,EAAA,SAAA;AAAA,QACR,uBAAyB,EAAA,aAAA;AAAA,QACzB,KAAO,EAAA;AAAA,OACT;AAAA,MAEC;AAAA;AAAA,GACH;AAGF,EAAA,MAAM,SAAqC,GAAA;AAAA,IACzC,GAAG,IAAA;AAAA,IACH,IAAM,EAAA,MAAA,IAAU,IAAS,KAAA,UAAA,GAAa,IAAO,GAAA,MAAA,CAAA;AAAA,IAC7C,SAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAI,YAAiB,KAAA,KAAA,GAAQ,EAAE,kBAAoB,EAAA,KAAA,KAAU;AAAC,GAChE;AAEA,EAAA,uBACG,IAAA,CAAAC,SAAA,CAAc,IAAd,EAAA,EAAoB,GAAG,SACtB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAACA,SAAc,CAAA,OAAA,EAAd,EAAsB,OAAA,EAAO,MAAE,QAAa,EAAA,YAAA,EAAA,CAAA;AAAA,oBAC7C,GAAA,CAAC,MAAO,EAAA,EAAA,QAAA,EAAU,CAAC,SAAA,EAAW,WAAW,SACvC,EAAA,QAAA,kBAAA,GAAA,CAACA,SAAc,CAAA,UAAA,EAAd,EACC,QAAA,kBAAA,IAAA;AAAA,MAACA,SAAc,CAAA,OAAA;AAAA,MAAd;AAAA,QACC,GAAA,EAAK,CAAC,IAAS,KAAA;AACb,UAAA,UAAA,CAAW,OAAU,GAAA,IAAA;AACrB,UAAA,IAAI,OAAO,GAAA,KAAQ,UAAY,EAAA,GAAA,CAAI,IAAI,CAAA;AAAA,eAC9B,IAAA,GAAA,EAAM,GAAA,CAAsD,OAAU,GAAA,IAAA;AAAA,SACjF;AAAA,QACC,GAAG,kBAAA;AAAA,QAEF,QAAA,EAAA;AAAA,UAAa,CAAA,SAAA,IAAA,QAAA,yBACZA,SAAc,CAAA,KAAA,EAAd,EACC,QAAC,kBAAA,GAAA,CAAAA,SAAA,CAAc,QAAd,EAAA,EAAuB,CAC1B,EAAA,CAAA;AAAA,UAED;AAAA;AAAA;AAAA,OAEL,CACF,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ,CAAC;AAQM,IAAM,UAAU,CAAC,EAAE,OAAO,QAAU,EAAA,GAAG,OAAkC,KAAA;AAE9E,EAAM,MAAA,OAAA,GAAU,mBAAmB,EAAE,IAAA,EAAM,MAAM,EAAI,EAAA,KAAA,EAAO,CAAK,IAAA,IAAA;AACjE,EACE,uBAAA,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,WAAa,EAAA,OAAA;AAAA,MAEb,mBAAA,EAAqB,UAAU,IAAO,GAAA,MAAA;AAAA,MACtC,OAAA,EACE,wBACG,GAAA,CAAA,MAAA,EAAA,EAAO,OAAM,OAAQ,EAAA,GAAA,EAAK,CAAG,EAAA,IAAA,EAAK,OACjC,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,UAAY,EAAA;AAAA,YACV,CAAA,EAAG,CAAC,EAAE,QAAAC,EAAAA,SAAAA,EAAe,qBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,SAAY,EAAA,QAAA,EAAAA,SAAS,EAAA,CAAA;AAAA,YACvD,QAAQ,CAAC,EAAE,UAAAA,SAAS,EAAA,yBACjB,IAAK,EAAA,EAAA,KAAA,EAAO,SAAW,EAAA,OAAA,EAAQ,SAAQ,OAAO,EAAA,IAAA,EAC7C,8BAAC,GAAG,EAAA,EAAA,QAAA,EAAAA,WAAS,CACf,EAAA,CAAA;AAAA,YAEF,IAAI,CAAC,EAAE,QAAAA,EAAAA,SAAAA,uBACJ,GAAA,CAAA,MAAA,EAAA,EAAO,EAAG,EAAA,IAAA,EAAK,OAAM,OAAQ,EAAA,GAAA,EAAK,GAAG,EAAI,EAAA,CAAA,EACvC,UAAAA,SACH,EAAA,CAAA;AAAA,YAEF,IAAI,CAAC,EAAE,UAAAA,SAAS,EAAA,yBACb,IAAK,EAAA,EAAA,KAAA,EAAO,WAAW,EAAG,EAAA,IAAA,EAAK,IAAI,CAAG,EAAA,QAAA,EAAS,MAAK,UAAW,EAAA,OAAA,EAC7D,UAAAA,SACH,EAAA,CAAA;AAAA,YAEF,GAAG,CAAC,EAAE,IAAM,EAAA,QAAA,EAAAA,WACV,qBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAM,QAAQ,GAAK,EAAA,MAAA,EAAO,UAAS,KAAM,EAAA,UAAA,EAC5C,UAAAA,SACH,EAAA;AAAA,WAEJ;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,SAEL,CACE,GAAA,IAAA;AAAA,MAEL,GAAG,KAAA;AAAA,MAEJ,8BAAC,MACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAG,QAAO,OAAQ,EAAA,cAAA,EAAe,MAAO,EAAA,SAAA,EAAU,QAAQ,EAAE,MAAA,EAAQ,SAAU,EAAA,EAChF,UACH,CACF,EAAA;AAAA;AAAA,GACF;AAEJ;AAEA,IAAO,eAAQ,GAAA","file":"chunk-RFUSESWB.mjs","sourcesContent":["import { Box, Link, Text, Tooltip as ChakraTooltip, Portal, VStack, useBreakpointValue } from '@chakra-ui/react';\nimport * as React from 'react';\nimport ReactMarkdown from 'react-markdown';\n\ntype TooltipPositioning = NonNullable<ChakraTooltip.RootProps['positioning']>;\ntype TooltipPlacement = TooltipPositioning['placement'];\ntype TooltipOffset = TooltipPositioning['offset'];\n\nexport interface TooltipProps extends Omit<ChakraTooltip.RootProps, 'children' | 'open'> {\n children: React.ReactNode;\n showArrow?: boolean;\n hasArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement | null>;\n content?: React.ReactNode;\n label?: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n isDisabled?: boolean;\n open?: boolean;\n isOpen?: boolean;\n placement?: TooltipPlacement;\n offset?: TooltipOffset;\n closeOnClick?: boolean;\n fontSize?: ChakraTooltip.ContentProps['fontSize'];\n width?: ChakraTooltip.ContentProps['width'];\n w?: ChakraTooltip.ContentProps['w'];\n bg?: ChakraTooltip.ContentProps['bg'];\n color?: ChakraTooltip.ContentProps['color'];\n px?: ChakraTooltip.ContentProps['px'];\n py?: ChakraTooltip.ContentProps['py'];\n borderRadius?: ChakraTooltip.ContentProps['borderRadius'];\n boxShadow?: ChakraTooltip.ContentProps['boxShadow'];\n zIndex?: ChakraTooltip.ContentProps['zIndex'];\n alignSelf?: ChakraTooltip.ContentProps['alignSelf'];\n openOnClick?: boolean;\n clickOpenDurationMs?: number;\n fullWidthTrigger?: boolean;\n}\n\n/** Low-level Chakra v3 tooltip primitive. Prefer `Tooltip` (the markdown wrapper) for app usage. */\nexport const TooltipPrimitive = React.forwardRef<HTMLDivElement, TooltipProps>(function TooltipPrimitive(\n props,\n ref,\n) {\n const {\n showArrow,\n hasArrow,\n children,\n disabled,\n isDisabled,\n portalled = true,\n content,\n label,\n contentProps,\n portalRef,\n open,\n isOpen,\n placement,\n offset,\n closeOnClick,\n fontSize,\n width,\n w,\n bg,\n color,\n px,\n py,\n borderRadius,\n boxShadow,\n zIndex,\n alignSelf,\n openOnClick,\n clickOpenDurationMs = 900,\n fullWidthTrigger = false,\n openDelay = 0,\n closeDelay = 0,\n ...rest\n } = props;\n\n // Tap-to-open when hover is unreliable (phones, many tablets). iOS can still report `(hover: hover)`,\n // so rely on maxTouchPoints / coarse pointer — not hover alone.\n const shouldOpenTooltipOnClick =\n typeof window !== 'undefined' &&\n (navigator.maxTouchPoints > 0 ||\n window.matchMedia?.('(pointer: coarse)')?.matches === true ||\n window.matchMedia?.('(hover: none)')?.matches === true);\n const resolvedOpenOnClick = openOnClick ?? shouldOpenTooltipOnClick;\n\n const [manualOpen, setManualOpen] = React.useState(false);\n const manualOpenTimeoutRef = React.useRef<number | null>(null);\n const triggerRef = React.useRef<HTMLSpanElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n\n const clearManualOpenTimeout = React.useCallback(() => {\n if (manualOpenTimeoutRef.current !== null) {\n window.clearTimeout(manualOpenTimeoutRef.current);\n manualOpenTimeoutRef.current = null;\n }\n }, []);\n\n React.useEffect(\n () => () => {\n clearManualOpenTimeout();\n },\n [clearManualOpenTimeout],\n );\n\n // When opened via tap/click, close on any outside click/tap.\n React.useEffect(() => {\n if (!resolvedOpenOnClick || !manualOpen) return;\n\n const onPointerDownCapture = (e: PointerEvent) => {\n const t = e.target;\n if (!(t instanceof Node)) return;\n if (triggerRef.current?.contains(t)) return;\n if (contentRef.current?.contains(t)) return;\n setManualOpen(false);\n clearManualOpenTimeout();\n };\n\n document.addEventListener('pointerdown', onPointerDownCapture, true);\n return () => document.removeEventListener('pointerdown', onPointerDownCapture, true);\n }, [clearManualOpenTimeout, manualOpen, resolvedOpenOnClick]);\n\n const isTooltipDisabled = disabled ?? isDisabled ?? false;\n if (isTooltipDisabled) {\n return <>{children}</>;\n }\n\n const tooltipContent = content ?? label;\n if (!tooltipContent) {\n return <>{children}</>;\n }\n\n const positioning =\n placement !== undefined || offset !== undefined\n ? {\n ...(rest.positioning ?? {}),\n ...(placement !== undefined ? { placement } : {}),\n ...(offset !== undefined ? { offset } : {}),\n }\n : rest.positioning;\n\n const mergedContentProps: ChakraTooltip.ContentProps = {\n fontSize,\n width,\n w,\n bg,\n color,\n px,\n py,\n borderRadius,\n boxShadow,\n zIndex,\n alignSelf,\n ...contentProps,\n };\n\n const openTooltipOnClick = () => {\n if (!resolvedOpenOnClick) {\n return;\n }\n setManualOpen(true);\n clearManualOpenTimeout();\n manualOpenTimeoutRef.current = window.setTimeout(() => {\n setManualOpen(false);\n manualOpenTimeoutRef.current = null;\n }, clickOpenDurationMs);\n };\n\n const triggerChild = (\n <span\n ref={triggerRef}\n onClick={resolvedOpenOnClick ? openTooltipOnClick : undefined}\n style={{\n display: fullWidthTrigger ? 'flex' : 'inline-flex',\n width: fullWidthTrigger ? '100%' : undefined,\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: resolvedOpenOnClick && !fullWidthTrigger ? 44 : undefined,\n minHeight: resolvedOpenOnClick && !fullWidthTrigger ? 44 : undefined,\n cursor: 'pointer',\n WebkitTapHighlightColor: 'transparent',\n color: 'var(--chakra-colors-contentPrimaryStrong)',\n }}\n >\n {children}\n </span>\n );\n\n const rootProps: ChakraTooltip.RootProps = {\n ...rest,\n open: isOpen ?? open ?? (manualOpen ? true : undefined),\n openDelay,\n closeDelay,\n positioning,\n ...(closeOnClick === false ? { closeOnPointerDown: false } : {}),\n };\n\n return (\n <ChakraTooltip.Root {...rootProps}>\n <ChakraTooltip.Trigger asChild>{triggerChild}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }}\n {...mergedContentProps}\n >\n {(showArrow || hasArrow) && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {tooltipContent}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n});\n\ninterface KollegioTooltipProps extends Omit<TooltipProps, 'content' | 'children'> {\n label?: string;\n children: React.ReactNode;\n}\n\n/** Brand tooltip: renders markdown `label`, tap-to-open on touch devices. */\nexport const Tooltip = ({ label, children, ...props }: KollegioTooltipProps) => {\n // On touch devices there is no hover; enable tap-to-open.\n const isTouch = useBreakpointValue({ base: true, lg: false }) ?? true;\n return (\n <TooltipPrimitive\n openOnClick={isTouch}\n // Give users time to read on mobile before auto-closing.\n clickOpenDurationMs={isTouch ? 2500 : undefined}\n content={\n label ? (\n <VStack align=\"start\" gap={2} maxW=\"280px\">\n <ReactMarkdown\n components={{\n p: ({ children }) => <Text color={'inherit'}>{children}</Text>,\n strong: ({ children }) => (\n <Text color={'inherit'} display=\"block\" asChild>\n <b>{children}</b>\n </Text>\n ),\n ul: ({ children }) => (\n <VStack as=\"ul\" align=\"start\" gap={1} pl={4}>\n {children}\n </VStack>\n ),\n li: ({ children }) => (\n <Text color={'inherit'} as=\"li\" ml={2} fontSize=\"sm\" lineHeight=\"short\">\n {children}\n </Text>\n ),\n a: ({ href, children }) => (\n <Link href={href ?? '#'} target=\"_blank\" color=\"blue.200\">\n {children}\n </Link>\n ),\n }}\n >\n {label}\n </ReactMarkdown>\n </VStack>\n ) : null\n }\n {...props}\n >\n <span>\n <Box as=\"span\" display=\"inline-block\" cursor=\"default\" _hover={{ cursor: 'pointer' }}>\n {children}\n </Box>\n </span>\n </TooltipPrimitive>\n );\n};\n\nexport default Tooltip;\n"]}
@@ -0,0 +1,181 @@
1
+ import { Button as Button$1 } from '@chakra-ui/react';
2
+ import { forwardRef, useRef } from 'react';
3
+ import { jsxs } from 'react/jsx-runtime';
4
+
5
+ // src/Button.tsx
6
+ var VARIANT_STYLES = {
7
+ primary: {
8
+ bg: "backgroundPrimary",
9
+ color: "white",
10
+ border: "1px solid",
11
+ borderColor: "borderBrandOpacity30",
12
+ _hover: { bg: "backgroundPrimarySubtle" }
13
+ },
14
+ primaryStrong: {
15
+ bg: "contentPrimaryStrong",
16
+ color: "white",
17
+ border: "1px solid",
18
+ borderColor: "borderBrandOpacity30",
19
+ _hover: { bg: "backgroundPrimarySubtle" },
20
+ _active: { bg: "backgroundPrimarySubtle" }
21
+ },
22
+ accent: {
23
+ bg: "backgroundAIAccent",
24
+ color: "white",
25
+ border: "1px solid",
26
+ borderColor: "borderBrandOpacity30",
27
+ _hover: { bg: "backgroundAIAccent", opacity: 0.65 }
28
+ },
29
+ outline: {
30
+ bg: "white",
31
+ border: "1px solid",
32
+ borderColor: "borderBrand",
33
+ color: "contentPrimaryStrong",
34
+ _hover: { bg: "white", borderColor: "borderBrand" }
35
+ },
36
+ secondary: {
37
+ bg: "backgroundSuccessAccent",
38
+ color: "contentPrimaryStrong",
39
+ border: "1px solid",
40
+ borderColor: "borderBrandOpacity30",
41
+ _hover: { bg: "backgroundBase3" }
42
+ },
43
+ tertiary: {
44
+ display: "flex",
45
+ gap: "16px",
46
+ alignItems: "center",
47
+ border: "none",
48
+ background: "none",
49
+ padding: "unset",
50
+ color: "contentPrimarySubtle",
51
+ fontSize: "14px",
52
+ _hover: { border: "none", background: "none", textDecoration: "underline" }
53
+ },
54
+ light: {
55
+ color: "contentPrimary",
56
+ background: "white",
57
+ border: "1px solid",
58
+ borderColor: "borderSecondary",
59
+ _hover: { background: "gray.50", borderColor: "borderSecondary" }
60
+ },
61
+ ghost: {
62
+ bg: "transparent",
63
+ color: "contentPrimaryStrong",
64
+ border: "none",
65
+ boxShadow: "none",
66
+ _hover: { bg: "transparent" }
67
+ },
68
+ oauth: {
69
+ bg: "white",
70
+ color: "primaryDark",
71
+ border: "1px solid",
72
+ borderColor: "borderSecondary",
73
+ borderRadius: "8px",
74
+ _hover: { borderColor: "borderBrand" }
75
+ },
76
+ logOut: {
77
+ border: "1px solid",
78
+ borderRadius: "xl",
79
+ borderColor: "black",
80
+ color: "black",
81
+ bg: "backgroundBase2",
82
+ _hover: { bg: "#FFE6E4" }
83
+ }
84
+ };
85
+ var SIZE_STYLES = {
86
+ sm: {
87
+ h: "26px",
88
+ minH: "26px",
89
+ px: "10px",
90
+ fontSize: "12px",
91
+ lineHeight: "150%",
92
+ borderRadius: "6px"
93
+ },
94
+ md: {
95
+ h: "auto",
96
+ minH: "unset",
97
+ py: "8px",
98
+ px: "12px",
99
+ fontSize: "14px",
100
+ lineHeight: "140%",
101
+ borderRadius: "4px"
102
+ },
103
+ lg: {
104
+ h: "40px",
105
+ minH: "40px",
106
+ py: "12px",
107
+ px: "12px",
108
+ fontSize: "14px",
109
+ lineHeight: "140%",
110
+ borderRadius: "8px"
111
+ }
112
+ };
113
+ var Button = forwardRef(function Button2({
114
+ variant = "primary",
115
+ buttonSize,
116
+ fullWidth,
117
+ isLoading,
118
+ leftIcon,
119
+ rightIcon,
120
+ children,
121
+ display,
122
+ alignItems,
123
+ gap,
124
+ flexShrink,
125
+ w,
126
+ width,
127
+ enableTouchEndClickFix = false,
128
+ disabled,
129
+ onClick,
130
+ onTouchEnd,
131
+ ...rest
132
+ }, ref) {
133
+ const hasIcons = Boolean(leftIcon || rightIcon);
134
+ const didFireTouchRef = useRef(false);
135
+ const resolvedButtonSize = buttonSize ?? (variant === "oauth" ? void 0 : "md");
136
+ const handleTouchEnd = enableTouchEndClickFix ? (e) => {
137
+ onTouchEnd?.(e);
138
+ if (disabled) return;
139
+ e.preventDefault();
140
+ didFireTouchRef.current = true;
141
+ onClick?.(e);
142
+ } : onTouchEnd;
143
+ const handleClick = (e) => {
144
+ if (enableTouchEndClickFix && didFireTouchRef.current) {
145
+ didFireTouchRef.current = false;
146
+ return;
147
+ }
148
+ onClick?.(e);
149
+ };
150
+ return /* @__PURE__ */ jsxs(
151
+ Button$1,
152
+ {
153
+ ref,
154
+ type: "button",
155
+ variant: "solid",
156
+ loading: isLoading,
157
+ disabled,
158
+ onClick: handleClick,
159
+ onTouchEnd: handleTouchEnd,
160
+ display: display ?? (hasIcons ? "inline-flex" : void 0),
161
+ alignItems: alignItems ?? (hasIcons ? "center" : void 0),
162
+ gap: gap ?? (hasIcons ? "4px" : void 0),
163
+ flexShrink: flexShrink ?? 0,
164
+ w: w ?? width ?? (fullWidth ? "full" : void 0),
165
+ width: width ?? (fullWidth && w == null ? "full" : void 0),
166
+ ...VARIANT_STYLES[variant],
167
+ ...resolvedButtonSize ? SIZE_STYLES[resolvedButtonSize] : {},
168
+ ...rest,
169
+ children: [
170
+ leftIcon,
171
+ children,
172
+ rightIcon
173
+ ]
174
+ }
175
+ );
176
+ });
177
+ var Button_default = Button;
178
+
179
+ export { Button, Button_default };
180
+ //# sourceMappingURL=chunk-RYGUHPYX.mjs.map
181
+ //# sourceMappingURL=chunk-RYGUHPYX.mjs.map