@mattermost/compass-ui 0.1.0-alpha.21 → 0.1.0-alpha.22
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.
- package/dist/components/combobox/Combobox.cjs +1 -1
- package/dist/components/combobox/Combobox.cjs.map +1 -1
- package/dist/components/combobox/Combobox.css +1 -1
- package/dist/components/combobox/Combobox.d.ts +43 -3
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +298 -283
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/Combobox.module.scss.cjs +1 -1
- package/dist/components/combobox/Combobox.module.scss.js +25 -25
- package/dist/components/combobox/index.d.ts +1 -1
- package/dist/components/combobox/index.d.ts.map +1 -1
- package/dist/components/modal/Modal.cjs +1 -1
- package/dist/components/modal/Modal.cjs.map +1 -1
- package/dist/components/modal/Modal.d.ts.map +1 -1
- package/dist/components/modal/Modal.js +91 -93
- package/dist/components/modal/Modal.js.map +1 -1
- package/dist/components/modal/ModalOverlay.cjs +2 -0
- package/dist/components/modal/ModalOverlay.cjs.map +1 -0
- package/dist/components/modal/ModalOverlay.css +1 -1
- package/dist/components/modal/ModalOverlay.d.ts +43 -0
- package/dist/components/modal/ModalOverlay.d.ts.map +1 -0
- package/dist/components/modal/ModalOverlay.js +59 -0
- package/dist/components/modal/ModalOverlay.js.map +1 -0
- package/dist/components/modal/ModalOverlay.module.scss.cjs +1 -1
- package/dist/components/modal/ModalOverlay.module.scss.js +3 -3
- package/dist/components/modal/index.cjs +1 -1
- package/dist/components/modal/index.d.ts +2 -0
- package/dist/components/modal/index.d.ts.map +1 -1
- package/dist/components/modal/index.js +4 -2
- package/dist/components/modal/index.js.map +1 -1
- package/dist/components/password-input/PasswordInput.css +1 -1
- package/dist/components/password-input/PasswordInput.module.scss.cjs +1 -1
- package/dist/components/password-input/PasswordInput.module.scss.js +12 -12
- package/dist/components/search-input/SearchInput.css +1 -1
- package/dist/components/search-input/SearchInput.module.scss.cjs +1 -1
- package/dist/components/search-input/SearchInput.module.scss.js +15 -15
- package/dist/components/text-area/TextArea.css +1 -1
- package/dist/components/text-area/TextArea.module.scss.cjs +1 -1
- package/dist/components/text-area/TextArea.module.scss.js +12 -12
- package/dist/components/text-input/TextInput.css +1 -1
- package/dist/components/text-input/TextInput.module.scss.cjs +1 -1
- package/dist/components/text-input/TextInput.module.scss.js +19 -19
- package/dist/components/tour-point/TourPoint.css +1 -1
- package/dist/components/tour-point/TourPoint.module.scss.cjs +1 -1
- package/dist/components/tour-point/TourPoint.module.scss.js +28 -28
- package/dist/index.cjs +1 -1
- package/dist/index.js +97 -95
- package/dist/index.js.map +1 -1
- package/dist/utils/scrollLock.cjs +2 -0
- package/dist/utils/scrollLock.cjs.map +1 -0
- package/dist/utils/scrollLock.d.ts +9 -0
- package/dist/utils/scrollLock.d.ts.map +1 -0
- package/dist/utils/scrollLock.js +38 -0
- package/dist/utils/scrollLock.js.map +1 -0
- package/dist/utils/useOnExited.cjs +2 -0
- package/dist/utils/useOnExited.cjs.map +1 -0
- package/dist/utils/useOnExited.d.ts +7 -0
- package/dist/utils/useOnExited.d.ts.map +1 -0
- package/dist/utils/useOnExited.js +14 -0
- package/dist/utils/useOnExited.js.map +1 -0
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -15,8 +15,8 @@ import { default as E } from "./components/checkbox/Checkbox.js";
|
|
|
15
15
|
import { default as _ } from "./components/chip/Chip.js";
|
|
16
16
|
import { default as N } from "./components/chip/ChipGroup.js";
|
|
17
17
|
import { default as R } from "./components/combobox/Combobox.js";
|
|
18
|
-
import { default as
|
|
19
|
-
import { default as
|
|
18
|
+
import { default as y } from "./components/date-range-picker/DateRangePicker.js";
|
|
19
|
+
import { default as F } from "./components/divider/Divider.js";
|
|
20
20
|
import { default as k } from "./components/dropdown/Dropdown.js";
|
|
21
21
|
import { default as Z } from "./components/emoji/Emoji.js";
|
|
22
22
|
import { EMOJI_BUTTON_EMOJI_SIZES as L, default as V } from "./components/emoji-button/EmojiButton.js";
|
|
@@ -40,48 +40,49 @@ import { default as Oe } from "./components/message-header/MessageHeader.js";
|
|
|
40
40
|
import { default as Ge } from "./components/reactions-row/ReactionsRow.js";
|
|
41
41
|
import { default as we } from "./components/reaction-button/ReactionButton.js";
|
|
42
42
|
import { default as He } from "./components/message-separator/MessageSeparator.js";
|
|
43
|
-
import { default as
|
|
44
|
-
import { default as
|
|
45
|
-
import { default as je } from "./components/modal
|
|
46
|
-
import { default as Je } from "./components/modal-
|
|
47
|
-
import { default as Ve } from "./components/
|
|
48
|
-
import { default as qe } from "./components/
|
|
49
|
-
import { default as Qe } from "./components/
|
|
50
|
-
import { default as Xe } from "./components/
|
|
51
|
-
import { default as $e } from "./components/
|
|
52
|
-
import { default as oo
|
|
53
|
-
import { default as uo } from "./components/popover-
|
|
54
|
-
import { default as mo } from "./components/
|
|
55
|
-
import { default as no } from "./components/
|
|
56
|
-
import { default as Po } from "./components/
|
|
57
|
-
import { default as Mo } from "./components/
|
|
58
|
-
import { default as Io } from "./components/
|
|
59
|
-
import { default as vo } from "./components/
|
|
60
|
-
import { default as Bo } from "./components/
|
|
61
|
-
import { default as ho } from "./components/search-
|
|
62
|
-
import { default as bo
|
|
63
|
-
import { default as _o } from "./components/
|
|
64
|
-
import { default as No } from "./components/
|
|
65
|
-
import { default as Ro } from "./components/
|
|
66
|
-
import { default as
|
|
67
|
-
import { default as
|
|
68
|
-
import { default as ko } from "./components/
|
|
69
|
-
import { default as Zo } from "./components/
|
|
70
|
-
import { default as Lo } from "./components/
|
|
71
|
-
import { default as Ko } from "./components/text-
|
|
72
|
-
import { default as zo } from "./components/
|
|
73
|
-
import { default as Wo } from "./components/thread-
|
|
74
|
-
import { default as Yo } from "./components/
|
|
75
|
-
import { default as er } from "./components/
|
|
76
|
-
import { default as rr } from "./components/
|
|
77
|
-
import { default as ar } from "./components/
|
|
78
|
-
import { default as sr } from "./components/
|
|
79
|
-
import { default as lr } from "./components/user-avatar
|
|
80
|
-
import {
|
|
81
|
-
import {
|
|
82
|
-
import {
|
|
83
|
-
import {
|
|
84
|
-
import {
|
|
43
|
+
import { default as De } from "./components/modal/Modal.js";
|
|
44
|
+
import { default as Ue } from "./components/modal/ModalOverlay.js";
|
|
45
|
+
import { default as je } from "./components/modal/ModalOverlay.module.scss.js";
|
|
46
|
+
import { default as Je } from "./components/modal-footer/ModalFooter.js";
|
|
47
|
+
import { default as Ve } from "./components/modal-header/ModalHeader.js";
|
|
48
|
+
import { default as qe } from "./components/more-unreads-banner/MoreUnreadsBanner.js";
|
|
49
|
+
import { default as Qe } from "./components/new-message-banner/NewMessageBanner.js";
|
|
50
|
+
import { default as Xe } from "./components/pagination-dots/PaginationDots.js";
|
|
51
|
+
import { default as $e } from "./components/permalink-preview/PermalinkPreview.js";
|
|
52
|
+
import { default as oo } from "./components/pinned-saved-indicators/PinnedSavedIndicators.js";
|
|
53
|
+
import { default as to, PopoverMenuDivider as ao, PopoverMenuGroup as fo, PopoverMenuGroupTitle as so, PopoverMenuScroll as lo, PopoverMenuTitle as uo } from "./components/popover-menu/PopoverMenu.js";
|
|
54
|
+
import { default as mo } from "./components/popover-notice/PopoverNotice.js";
|
|
55
|
+
import { default as no } from "./components/profile-popover/ProfilePopover.js";
|
|
56
|
+
import { default as Po } from "./components/progress-bar/ProgressBar.js";
|
|
57
|
+
import { default as Mo } from "./components/radio/Radio.js";
|
|
58
|
+
import { default as Io } from "./components/right-sidebar-header/RightSidebarHeader.js";
|
|
59
|
+
import { default as vo } from "./components/scrollbar/Scrollbar.js";
|
|
60
|
+
import { default as Bo } from "./components/password-input/PasswordInput.js";
|
|
61
|
+
import { default as ho } from "./components/search-input/SearchInput.js";
|
|
62
|
+
import { default as bo } from "./components/search-tip-banner/SearchTipBanner.js";
|
|
63
|
+
import { default as Oo, ShortcutTagGroup as _o } from "./components/shortcut-tag/ShortcutTag.js";
|
|
64
|
+
import { default as No } from "./components/section-notice/SectionNotice.js";
|
|
65
|
+
import { default as Ro } from "./components/select/Select.js";
|
|
66
|
+
import { default as yo } from "./components/spinner/Spinner.js";
|
|
67
|
+
import { default as Fo } from "./components/status-badge/StatusBadge.js";
|
|
68
|
+
import { default as ko } from "./components/switch/Switch.js";
|
|
69
|
+
import { default as Zo } from "./components/tabs/Tabs.js";
|
|
70
|
+
import { default as Lo } from "./components/team-avatar/TeamAvatar.js";
|
|
71
|
+
import { default as Ko } from "./components/text-area/TextArea.js";
|
|
72
|
+
import { default as zo } from "./components/text-input/TextInput.js";
|
|
73
|
+
import { default as Wo } from "./components/thread-footer/ThreadFooter.js";
|
|
74
|
+
import { default as Yo } from "./components/thread-list-item/ThreadListItem.js";
|
|
75
|
+
import { default as er } from "./components/toast/Toast.js";
|
|
76
|
+
import { default as rr } from "./components/tooltip/Tooltip.js";
|
|
77
|
+
import { default as ar } from "./components/tour-point/TourPoint.js";
|
|
78
|
+
import { default as sr } from "./components/unread-badge/UnreadBadge.js";
|
|
79
|
+
import { default as lr } from "./components/user-avatar/UserAvatar.js";
|
|
80
|
+
import { default as pr } from "./components/user-avatar-group/UserAvatarGroup.js";
|
|
81
|
+
import { useControllable as xr } from "./hooks/use-controllable.js";
|
|
82
|
+
import { useExitAnimation as ir } from "./hooks/use-exit-animation.js";
|
|
83
|
+
import { useOutsideClose as Sr } from "./hooks/use-outside-close.js";
|
|
84
|
+
import { POPOVER_TRANSITION_MS as cr, usePopoverTransition as Ir } from "./hooks/use-popover-transition.js";
|
|
85
|
+
import { toKebab as vr } from "./utils/string.js";
|
|
85
86
|
export {
|
|
86
87
|
l as AdminConsoleFooter,
|
|
87
88
|
a as AdminConsoleHeader,
|
|
@@ -98,8 +99,8 @@ export {
|
|
|
98
99
|
_ as Chip,
|
|
99
100
|
N as ChipGroup,
|
|
100
101
|
R as Combobox,
|
|
101
|
-
|
|
102
|
-
|
|
102
|
+
y as DateRangePicker,
|
|
103
|
+
F as Divider,
|
|
103
104
|
k as Dropdown,
|
|
104
105
|
L as EMOJI_BUTTON_EMOJI_SIZES,
|
|
105
106
|
Z as Emoji,
|
|
@@ -123,61 +124,62 @@ export {
|
|
|
123
124
|
be as MessageActions,
|
|
124
125
|
Oe as MessageHeader,
|
|
125
126
|
He as MessageSeparator,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
qe as
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
$e as
|
|
136
|
-
oo as
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
uo as
|
|
143
|
-
mo as
|
|
144
|
-
no as
|
|
145
|
-
Po as
|
|
127
|
+
De as Modal,
|
|
128
|
+
Je as ModalFooter,
|
|
129
|
+
Ve as ModalHeader,
|
|
130
|
+
Ue as ModalOverlay,
|
|
131
|
+
qe as MoreUnreadsBanner,
|
|
132
|
+
Qe as NewMessageBanner,
|
|
133
|
+
cr as POPOVER_TRANSITION_MS,
|
|
134
|
+
Xe as PaginationDots,
|
|
135
|
+
Bo as PasswordInput,
|
|
136
|
+
$e as PermalinkPreview,
|
|
137
|
+
oo as PinnedSavedIndicators,
|
|
138
|
+
to as PopoverMenu,
|
|
139
|
+
ao as PopoverMenuDivider,
|
|
140
|
+
fo as PopoverMenuGroup,
|
|
141
|
+
so as PopoverMenuGroupTitle,
|
|
142
|
+
lo as PopoverMenuScroll,
|
|
143
|
+
uo as PopoverMenuTitle,
|
|
144
|
+
mo as PopoverNotice,
|
|
145
|
+
no as ProfilePopover,
|
|
146
|
+
Po as ProgressBar,
|
|
147
|
+
Mo as Radio,
|
|
146
148
|
we as ReactionButton,
|
|
147
149
|
Ge as ReactionsRow,
|
|
148
|
-
|
|
150
|
+
Io as RightSidebarHeader,
|
|
149
151
|
de as SVG_SIZE_MAP,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
152
|
+
vo as Scrollbar,
|
|
153
|
+
ho as SearchInput,
|
|
154
|
+
bo as SearchTipBanner,
|
|
155
|
+
No as SectionNotice,
|
|
156
|
+
Ro as Select,
|
|
157
|
+
Oo as ShortcutTag,
|
|
158
|
+
_o as ShortcutTagGroup,
|
|
159
|
+
yo as Spinner,
|
|
160
|
+
Fo as StatusBadge,
|
|
161
|
+
ko as Switch,
|
|
162
|
+
Zo as Tabs,
|
|
161
163
|
Me as Tag,
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
164
|
+
Lo as TeamAvatar,
|
|
165
|
+
Ko as TextArea,
|
|
166
|
+
zo as TextInput,
|
|
167
|
+
Wo as ThreadFooter,
|
|
168
|
+
Yo as ThreadListItem,
|
|
167
169
|
r as TileButton,
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
er as Toast,
|
|
171
|
+
rr as Tooltip,
|
|
172
|
+
ar as TourPoint,
|
|
173
|
+
sr as UnreadBadge,
|
|
174
|
+
lr as UserAvatar,
|
|
175
|
+
pr as UserAvatarGroup,
|
|
174
176
|
c as btnStyles,
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
177
|
+
je as modalOverlayStyles,
|
|
178
|
+
vr as toKebab,
|
|
179
|
+
xr as useControllable,
|
|
180
|
+
ir as useExitAnimation,
|
|
179
181
|
le as useIconSlotContext,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
+
Sr as useOutsideClose,
|
|
183
|
+
Ir as usePopoverTransition
|
|
182
184
|
};
|
|
183
185
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=Symbol.for("@mattermost/compass-ui/scroll-lock/v1");function a(o){const e=globalThis;let t=e[s];t||(t=new WeakMap,e[s]=t);let n=t.get(o);return n||(n={count:0,savedOverflow:"",savedPaddingRight:""},t.set(o,n)),n}function r(o){var n;const e=o.documentElement.clientWidth,t=((n=o.defaultView)==null?void 0:n.innerWidth)??0;return e>0&&t>e?t-e:0}function u(o=typeof document>"u"?void 0:document){var i;if(!o)return()=>{};const{body:e}=o,t=a(o);if(t.count===0){const l=r(o);if(t.savedOverflow=e.style.overflow,t.savedPaddingRight=e.style.paddingRight,l>0){const d=parseFloat(((i=o.defaultView)==null?void 0:i.getComputedStyle(e).paddingRight)??"")||0;e.style.paddingRight=`${d+l}px`}e.style.overflow="hidden"}t.count+=1;let n=!1;return()=>{n||(n=!0,t.count-=1,t.count===0&&(e.style.overflow=t.savedOverflow,e.style.paddingRight=t.savedPaddingRight))}}exports.lockBodyScroll=u;
|
|
2
|
+
//# sourceMappingURL=scrollLock.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollLock.cjs","sources":["../../src/utils/scrollLock.ts"],"sourcesContent":["interface ScrollLockState {\n count: number;\n savedOverflow: string;\n savedPaddingRight: string;\n}\n\n// Shared on globalThis so every bundled compass-ui copy on the page counts the same locks.\nconst STATE_KEY = Symbol.for('@mattermost/compass-ui/scroll-lock/v1');\n\n// Keyed per document so a popout window or iframe locks and restores independently.\nfunction getState(doc: Document): ScrollLockState {\n const host = globalThis as unknown as Record<\n symbol,\n WeakMap<Document, ScrollLockState> | undefined\n >;\n let states = host[STATE_KEY];\n if (!states) {\n states = new WeakMap();\n host[STATE_KEY] = states;\n }\n let state = states.get(doc);\n if (!state) {\n state = { count: 0, savedOverflow: '', savedPaddingRight: '' };\n states.set(doc, state);\n }\n return state;\n}\n\nfunction scrollbarWidth(doc: Document): number {\n const viewport = doc.documentElement.clientWidth;\n const outer = doc.defaultView?.innerWidth ?? 0;\n // clientWidth is 0 in non-layout environments (jsdom); don't treat that as a scrollbar.\n return viewport > 0 && outer > viewport ? outer - viewport : 0;\n}\n\n/**\n * Locks scroll on `doc.body` (default: the global `document`). Ref-counted so\n * stacked locks restore the original `overflow` only once the last one is\n * released. Pads the body by the scrollbar width so the page doesn't shift\n * sideways when the scrollbar disappears. Returns the release function; calling\n * it more than once is a no-op.\n */\nexport function lockBodyScroll(\n doc: Document | undefined = typeof document === 'undefined'\n ? undefined\n : document,\n): () => void {\n if (!doc) return () => {};\n\n const { body } = doc;\n const state = getState(doc);\n if (state.count === 0) {\n const gap = scrollbarWidth(doc);\n state.savedOverflow = body.style.overflow;\n state.savedPaddingRight = body.style.paddingRight;\n if (gap > 0) {\n const base =\n parseFloat(\n doc.defaultView?.getComputedStyle(body).paddingRight ?? '',\n ) || 0;\n body.style.paddingRight = `${base + gap}px`;\n }\n body.style.overflow = 'hidden';\n }\n state.count += 1;\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n state.count -= 1;\n if (state.count === 0) {\n body.style.overflow = state.savedOverflow;\n body.style.paddingRight = state.savedPaddingRight;\n }\n };\n}\n"],"names":["STATE_KEY","getState","doc","host","states","state","scrollbarWidth","viewport","outer","_a","lockBodyScroll","body","gap","base","released"],"mappings":"gFAOA,MAAMA,EAAY,OAAO,IAAI,uCAAuC,EAGpE,SAASC,EAASC,EAAgC,CAChD,MAAMC,EAAO,WAIb,IAAIC,EAASD,EAAKH,CAAS,EACtBI,IACHA,MAAa,QACbD,EAAKH,CAAS,EAAII,GAEpB,IAAIC,EAAQD,EAAO,IAAIF,CAAG,EAC1B,OAAKG,IACHA,EAAQ,CAAE,MAAO,EAAG,cAAe,GAAI,kBAAmB,EAAA,EAC1DD,EAAO,IAAIF,EAAKG,CAAK,GAEhBA,CACT,CAEA,SAASC,EAAeJ,EAAuB,OAC7C,MAAMK,EAAWL,EAAI,gBAAgB,YAC/BM,IAAQC,EAAAP,EAAI,cAAJ,YAAAO,EAAiB,aAAc,EAE7C,OAAOF,EAAW,GAAKC,EAAQD,EAAWC,EAAQD,EAAW,CAC/D,CASO,SAASG,EACdR,EAA4B,OAAO,SAAa,IAC5C,OACA,SACQ,OACZ,GAAI,CAACA,EAAK,MAAO,IAAM,CAAC,EAExB,KAAM,CAAE,KAAAS,GAAST,EACXG,EAAQJ,EAASC,CAAG,EAC1B,GAAIG,EAAM,QAAU,EAAG,CACrB,MAAMO,EAAMN,EAAeJ,CAAG,EAG9B,GAFAG,EAAM,cAAgBM,EAAK,MAAM,SACjCN,EAAM,kBAAoBM,EAAK,MAAM,aACjCC,EAAM,EAAG,CACX,MAAMC,EACJ,aACEJ,EAAAP,EAAI,cAAJ,YAAAO,EAAiB,iBAAiBE,GAAM,eAAgB,EAAA,GACrD,EACPA,EAAK,MAAM,aAAe,GAAGE,EAAOD,CAAG,IACzC,CACAD,EAAK,MAAM,SAAW,QACxB,CACAN,EAAM,OAAS,EAEf,IAAIS,EAAW,GACf,MAAO,IAAM,CACPA,IACJA,EAAW,GACXT,EAAM,OAAS,EACXA,EAAM,QAAU,IAClBM,EAAK,MAAM,SAAWN,EAAM,cAC5BM,EAAK,MAAM,aAAeN,EAAM,mBAEpC,CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locks scroll on `doc.body` (default: the global `document`). Ref-counted so
|
|
3
|
+
* stacked locks restore the original `overflow` only once the last one is
|
|
4
|
+
* released. Pads the body by the scrollbar width so the page doesn't shift
|
|
5
|
+
* sideways when the scrollbar disappears. Returns the release function; calling
|
|
6
|
+
* it more than once is a no-op.
|
|
7
|
+
*/
|
|
8
|
+
export declare function lockBodyScroll(doc?: Document | undefined): () => void;
|
|
9
|
+
//# sourceMappingURL=scrollLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollLock.d.ts","sourceRoot":"","sources":["../../src/utils/scrollLock.ts"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,GAAG,GAAE,QAAQ,GAAG,SAEJ,GACX,MAAM,IAAI,CA8BZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const l = Symbol.for("@mattermost/compass-ui/scroll-lock/v1");
|
|
2
|
+
function d(n) {
|
|
3
|
+
const e = globalThis;
|
|
4
|
+
let t = e[l];
|
|
5
|
+
t || (t = /* @__PURE__ */ new WeakMap(), e[l] = t);
|
|
6
|
+
let o = t.get(n);
|
|
7
|
+
return o || (o = { count: 0, savedOverflow: "", savedPaddingRight: "" }, t.set(n, o)), o;
|
|
8
|
+
}
|
|
9
|
+
function r(n) {
|
|
10
|
+
var o;
|
|
11
|
+
const e = n.documentElement.clientWidth, t = ((o = n.defaultView) == null ? void 0 : o.innerWidth) ?? 0;
|
|
12
|
+
return e > 0 && t > e ? t - e : 0;
|
|
13
|
+
}
|
|
14
|
+
function u(n = typeof document > "u" ? void 0 : document) {
|
|
15
|
+
var i;
|
|
16
|
+
if (!n) return () => {
|
|
17
|
+
};
|
|
18
|
+
const { body: e } = n, t = d(n);
|
|
19
|
+
if (t.count === 0) {
|
|
20
|
+
const s = r(n);
|
|
21
|
+
if (t.savedOverflow = e.style.overflow, t.savedPaddingRight = e.style.paddingRight, s > 0) {
|
|
22
|
+
const a = parseFloat(
|
|
23
|
+
((i = n.defaultView) == null ? void 0 : i.getComputedStyle(e).paddingRight) ?? ""
|
|
24
|
+
) || 0;
|
|
25
|
+
e.style.paddingRight = `${a + s}px`;
|
|
26
|
+
}
|
|
27
|
+
e.style.overflow = "hidden";
|
|
28
|
+
}
|
|
29
|
+
t.count += 1;
|
|
30
|
+
let o = !1;
|
|
31
|
+
return () => {
|
|
32
|
+
o || (o = !0, t.count -= 1, t.count === 0 && (e.style.overflow = t.savedOverflow, e.style.paddingRight = t.savedPaddingRight));
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
u as lockBodyScroll
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=scrollLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollLock.js","sources":["../../src/utils/scrollLock.ts"],"sourcesContent":["interface ScrollLockState {\n count: number;\n savedOverflow: string;\n savedPaddingRight: string;\n}\n\n// Shared on globalThis so every bundled compass-ui copy on the page counts the same locks.\nconst STATE_KEY = Symbol.for('@mattermost/compass-ui/scroll-lock/v1');\n\n// Keyed per document so a popout window or iframe locks and restores independently.\nfunction getState(doc: Document): ScrollLockState {\n const host = globalThis as unknown as Record<\n symbol,\n WeakMap<Document, ScrollLockState> | undefined\n >;\n let states = host[STATE_KEY];\n if (!states) {\n states = new WeakMap();\n host[STATE_KEY] = states;\n }\n let state = states.get(doc);\n if (!state) {\n state = { count: 0, savedOverflow: '', savedPaddingRight: '' };\n states.set(doc, state);\n }\n return state;\n}\n\nfunction scrollbarWidth(doc: Document): number {\n const viewport = doc.documentElement.clientWidth;\n const outer = doc.defaultView?.innerWidth ?? 0;\n // clientWidth is 0 in non-layout environments (jsdom); don't treat that as a scrollbar.\n return viewport > 0 && outer > viewport ? outer - viewport : 0;\n}\n\n/**\n * Locks scroll on `doc.body` (default: the global `document`). Ref-counted so\n * stacked locks restore the original `overflow` only once the last one is\n * released. Pads the body by the scrollbar width so the page doesn't shift\n * sideways when the scrollbar disappears. Returns the release function; calling\n * it more than once is a no-op.\n */\nexport function lockBodyScroll(\n doc: Document | undefined = typeof document === 'undefined'\n ? undefined\n : document,\n): () => void {\n if (!doc) return () => {};\n\n const { body } = doc;\n const state = getState(doc);\n if (state.count === 0) {\n const gap = scrollbarWidth(doc);\n state.savedOverflow = body.style.overflow;\n state.savedPaddingRight = body.style.paddingRight;\n if (gap > 0) {\n const base =\n parseFloat(\n doc.defaultView?.getComputedStyle(body).paddingRight ?? '',\n ) || 0;\n body.style.paddingRight = `${base + gap}px`;\n }\n body.style.overflow = 'hidden';\n }\n state.count += 1;\n\n let released = false;\n return () => {\n if (released) return;\n released = true;\n state.count -= 1;\n if (state.count === 0) {\n body.style.overflow = state.savedOverflow;\n body.style.paddingRight = state.savedPaddingRight;\n }\n };\n}\n"],"names":["STATE_KEY","getState","doc","host","states","state","scrollbarWidth","_a","viewport","outer","lockBodyScroll","body","gap","base","released"],"mappings":"AAOA,MAAMA,IAAY,OAAO,IAAI,uCAAuC;AAGpE,SAASC,EAASC,GAAgC;AAChD,QAAMC,IAAO;AAIb,MAAIC,IAASD,EAAKH,CAAS;AAC3B,EAAKI,MACHA,wBAAa,QAAA,GACbD,EAAKH,CAAS,IAAII;AAEpB,MAAIC,IAAQD,EAAO,IAAIF,CAAG;AAC1B,SAAKG,MACHA,IAAQ,EAAE,OAAO,GAAG,eAAe,IAAI,mBAAmB,GAAA,GAC1DD,EAAO,IAAIF,GAAKG,CAAK,IAEhBA;AACT;AAEA,SAASC,EAAeJ,GAAuB;AArB/C,MAAAK;AAsBE,QAAMC,IAAWN,EAAI,gBAAgB,aAC/BO,MAAQF,IAAAL,EAAI,gBAAJ,gBAAAK,EAAiB,eAAc;AAE7C,SAAOC,IAAW,KAAKC,IAAQD,IAAWC,IAAQD,IAAW;AAC/D;AASO,SAASE,EACdR,IAA4B,OAAO,WAAa,MAC5C,SACA,UACQ;AAvCd,MAAAK;AAwCE,MAAI,CAACL,EAAK,QAAO,MAAM;AAAA,EAAC;AAExB,QAAM,EAAE,MAAAS,MAAST,GACXG,IAAQJ,EAASC,CAAG;AAC1B,MAAIG,EAAM,UAAU,GAAG;AACrB,UAAMO,IAAMN,EAAeJ,CAAG;AAG9B,QAFAG,EAAM,gBAAgBM,EAAK,MAAM,UACjCN,EAAM,oBAAoBM,EAAK,MAAM,cACjCC,IAAM,GAAG;AACX,YAAMC,IACJ;AAAA,UACEN,IAAAL,EAAI,gBAAJ,gBAAAK,EAAiB,iBAAiBI,GAAM,iBAAgB;AAAA,MAAA,KACrD;AACP,MAAAA,EAAK,MAAM,eAAe,GAAGE,IAAOD,CAAG;AAAA,IACzC;AACA,IAAAD,EAAK,MAAM,WAAW;AAAA,EACxB;AACA,EAAAN,EAAM,SAAS;AAEf,MAAIS,IAAW;AACf,SAAO,MAAM;AACX,IAAIA,MACJA,IAAW,IACXT,EAAM,SAAS,GACXA,EAAM,UAAU,MAClBM,EAAK,MAAM,WAAWN,EAAM,eAC5BM,EAAK,MAAM,eAAeN,EAAM;AAAA,EAEpC;AACF;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react");function n(e,u,c=!0){const s=r.useRef(e),t=r.useRef(u);r.useEffect(()=>{t.current=u}),r.useEffect(()=>{var f;s.current&&!e&&c&&((f=t.current)==null||f.call(t)),s.current=e},[e,c])}exports.useOnExited=n;
|
|
2
|
+
//# sourceMappingURL=useOnExited.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnExited.cjs","sources":["../../src/utils/useOnExited.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * Calls `onExited` once `mounted` flips from true to false. Not called if the\n * component unmounts during the exit. Pass `enabled={false}` to skip it (e.g. a\n * mount-controlled `Modal`). Internal: `hooks/` is a public subpath export.\n */\nexport function useOnExited(\n mounted: boolean,\n onExited: (() => void) | undefined,\n enabled = true,\n) {\n const wasMounted = useRef(mounted);\n const onExitedRef = useRef(onExited);\n // Declared before the exit effect so it commits the latest callback first.\n useEffect(() => {\n onExitedRef.current = onExited;\n });\n\n useEffect(() => {\n if (wasMounted.current && !mounted && enabled) onExitedRef.current?.();\n wasMounted.current = mounted;\n }, [mounted, enabled]);\n}\n"],"names":["useOnExited","mounted","onExited","enabled","wasMounted","useRef","onExitedRef","useEffect"],"mappings":"yGAOO,SAASA,EACdC,EACAC,EACAC,EAAU,GACV,CACA,MAAMC,EAAaC,EAAAA,OAAOJ,CAAO,EAC3BK,EAAcD,EAAAA,OAAOH,CAAQ,EAEnCK,EAAAA,UAAU,IAAM,CACdD,EAAY,QAAUJ,CACxB,CAAC,EAEDK,EAAAA,UAAU,IAAM,OACVH,EAAW,SAAW,CAACH,GAAWE,SAAqB,2BAC3DC,EAAW,QAAUH,CACvB,EAAG,CAACA,EAASE,CAAO,CAAC,CACvB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calls `onExited` once `mounted` flips from true to false. Not called if the
|
|
3
|
+
* component unmounts during the exit. Pass `enabled={false}` to skip it (e.g. a
|
|
4
|
+
* mount-controlled `Modal`). Internal: `hooks/` is a public subpath export.
|
|
5
|
+
*/
|
|
6
|
+
export declare function useOnExited(mounted: boolean, onExited: (() => void) | undefined, enabled?: boolean): void;
|
|
7
|
+
//# sourceMappingURL=useOnExited.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnExited.d.ts","sourceRoot":"","sources":["../../src/utils/useOnExited.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,EAClC,OAAO,UAAO,QAaf"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useRef as f, useEffect as n } from "react";
|
|
2
|
+
function o(r, t, u = !0) {
|
|
3
|
+
const s = f(r), c = f(t);
|
|
4
|
+
n(() => {
|
|
5
|
+
c.current = t;
|
|
6
|
+
}), n(() => {
|
|
7
|
+
var e;
|
|
8
|
+
s.current && !r && u && ((e = c.current) == null || e.call(c)), s.current = r;
|
|
9
|
+
}, [r, u]);
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
o as useOnExited
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=useOnExited.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOnExited.js","sources":["../../src/utils/useOnExited.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/**\n * Calls `onExited` once `mounted` flips from true to false. Not called if the\n * component unmounts during the exit. Pass `enabled={false}` to skip it (e.g. a\n * mount-controlled `Modal`). Internal: `hooks/` is a public subpath export.\n */\nexport function useOnExited(\n mounted: boolean,\n onExited: (() => void) | undefined,\n enabled = true,\n) {\n const wasMounted = useRef(mounted);\n const onExitedRef = useRef(onExited);\n // Declared before the exit effect so it commits the latest callback first.\n useEffect(() => {\n onExitedRef.current = onExited;\n });\n\n useEffect(() => {\n if (wasMounted.current && !mounted && enabled) onExitedRef.current?.();\n wasMounted.current = mounted;\n }, [mounted, enabled]);\n}\n"],"names":["useOnExited","mounted","onExited","enabled","wasMounted","useRef","onExitedRef","useEffect"],"mappings":";AAOO,SAASA,EACdC,GACAC,GACAC,IAAU,IACV;AACA,QAAMC,IAAaC,EAAOJ,CAAO,GAC3BK,IAAcD,EAAOH,CAAQ;AAEnC,EAAAK,EAAU,MAAM;AACd,IAAAD,EAAY,UAAUJ;AAAA,EACxB,CAAC,GAEDK,EAAU,MAAM;;AACd,IAAIH,EAAW,WAAW,CAACH,KAAWE,aAAqB,gCAC3DC,EAAW,UAAUH;AAAA,EACvB,GAAG,CAACA,GAASE,CAAO,CAAC;AACvB;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mattermost/compass-ui",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.22",
|
|
4
4
|
"description": "Compass design system UI components for Mattermost products",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
"@storybook/react": "^8.6.14",
|
|
77
77
|
"@storybook/react-vite": "^8.6.14",
|
|
78
78
|
"@storybook/test": "^8.6.14",
|
|
79
|
+
"@testing-library/user-event": "^14.5.2",
|
|
79
80
|
"@types/react": "^19.0.0",
|
|
80
81
|
"@types/react-dom": "^19.0.0",
|
|
81
82
|
"@vitejs/plugin-react": "^4.3.4",
|