@colisweb/rescript-toolkit 2.63.1 → 2.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colisweb/rescript-toolkit",
3
- "version": "2.63.1",
3
+ "version": "2.65.0",
4
4
  "scripts": {
5
5
  "clean": "rescript clean",
6
6
  "build": "rescript build -with-deps",
@@ -28,19 +28,19 @@
28
28
  "@colisweb/react-day-picker": "7.4.16",
29
29
  "@colisweb/restorative": "0.5.1",
30
30
  "@datadog/browser-rum": "4.26.0",
31
- "@reach/accordion": "0.17.0",
32
- "@reach/alert-dialog": "0.17.0",
33
- "@reach/auto-id": "0.17.0",
34
- "@reach/combobox": "0.17.0",
35
- "@reach/dialog": "0.17.0",
36
- "@reach/disclosure": "0.17.0",
37
- "@reach/listbox": "0.17.0",
38
- "@reach/menu-button": "0.17.0",
39
- "@reach/popover": "0.17.0",
40
- "@reach/portal": "0.17.0",
41
- "@reach/tabs": "0.17.0",
42
- "@reach/tooltip": "0.17.0",
43
- "@reach/visually-hidden": "0.17.0",
31
+ "@reach/accordion": "0.18.0",
32
+ "@reach/alert-dialog": "0.18.0",
33
+ "@reach/auto-id": "0.18.0",
34
+ "@reach/combobox": "0.18.0",
35
+ "@reach/dialog": "0.18.0",
36
+ "@reach/disclosure": "0.18.0",
37
+ "@reach/listbox": "0.18.0",
38
+ "@reach/menu-button": "0.18.0",
39
+ "@reach/popover": "0.18.0",
40
+ "@reach/portal": "0.18.0",
41
+ "@reach/tabs": "0.18.0",
42
+ "@reach/tooltip": "0.18.0",
43
+ "@reach/visually-hidden": "0.18.0",
44
44
  "@rescript/react": "0.10.3",
45
45
  "@tailwindcss/line-clamp": "0.4.2",
46
46
  "autoprefixer": "10.4.13",
@@ -86,6 +86,40 @@ module Make = (Config: RouterConfig) => {
86
86
 
87
87
  let toString = Config.toString
88
88
 
89
+ module Breadcrumb = {
90
+ type link = {
91
+ route: Config.t,
92
+ text: React.element,
93
+ }
94
+ type state = {links: option<array<link>>}
95
+
96
+ type action =
97
+ | Reset
98
+ | Update(array<link>)
99
+
100
+ let store = Restorative.createStore({links: None}, (_state, action) =>
101
+ switch action {
102
+ | Reset => {links: None}
103
+ | Update(links) => {links: Some(links)}
104
+ }
105
+ )
106
+
107
+ let use = (routes: array<link>) => {
108
+ React.useLayoutEffect0(() => {
109
+ store.dispatch(Update(routes))
110
+
111
+ Some(() => store.dispatch(Reset))
112
+ })
113
+ }
114
+ }
115
+
116
+ let usePreviousLinkWithDefault = (defaultRoute, cb) => {
117
+ let {previousRoute} = React.useContext(routerContext)
118
+ previousRoute->Option.mapWithDefault(defaultRoute, route => {
119
+ cb(route) ? route : defaultRoute
120
+ })
121
+ }
122
+
89
123
  module Link = {
90
124
  @react.component
91
125
  let make = (
@@ -185,7 +219,13 @@ module Make = (Config: RouterConfig) => {
185
219
 
186
220
  module SingleLink = {
187
221
  @react.component
188
- let make = (~link: link, ~isNavOpen: bool, ~isSubLink=false, ~onLinkClick=() => ()) =>
222
+ let make = (
223
+ ~link: link,
224
+ ~isNavOpen: bool,
225
+ ~isSubLink=false,
226
+ ~isActive=false,
227
+ ~onLinkClick=() => (),
228
+ ) =>
189
229
  switch link {
190
230
  | Legacy({icon, label, url}) =>
191
231
  <a
@@ -213,7 +253,12 @@ module Make = (Config: RouterConfig) => {
213
253
  | App({icon, label, route}) =>
214
254
  <Link
215
255
  route
216
- className={cx([commonClassName, isSubLink ? "ml-3" : "", "sidenav-link"])}
256
+ className={cx([
257
+ commonClassName,
258
+ isSubLink ? "ml-3" : "",
259
+ "sidenav-link",
260
+ isActive ? "bg-primary-100/75 text-neutral-700" : "",
261
+ ])}
217
262
  activeClassName="bg-primary-100/75 text-neutral-700"
218
263
  onClick={_ => onLinkClick()}>
219
264
  <span className="overflow-hidden flex">
@@ -255,6 +300,17 @@ module Make = (Config: RouterConfig) => {
255
300
  | App({route}) => isRouteEqual(currentRoute, route)
256
301
  }
257
302
  })
303
+ let breadcrumb = Breadcrumb.store.useStore()
304
+
305
+ let relativeRoute = breadcrumb.links->Option.mapWithDefault(None, breadcrumbLinks => {
306
+ links->Array.getBy(link => {
307
+ switch link {
308
+ | Legacy(_) => false
309
+ | App({route}) =>
310
+ breadcrumbLinks->Array.some(breadcrumbLink => breadcrumbLink.route->isRouteEqual(route))
311
+ }
312
+ })
313
+ })
258
314
 
259
315
  React.useEffect1(() => {
260
316
  if !isNavOpen {
@@ -272,11 +328,7 @@ module Make = (Config: RouterConfig) => {
272
328
  className={cx([
273
329
  commonClassName,
274
330
  "flex items-center w-full sidenav-link",
275
- switch (hasActiveSubRoute, isNavOpen) {
276
- | (true, true) => "bg-primary-100/50"
277
- | (true, false) => "bg-primary-100/75"
278
- | (false, _) => ""
279
- },
331
+ hasActiveSubRoute || relativeRoute->Option.isSome ? "bg-primary-100/75" : "",
280
332
  ])}>
281
333
  <span className={cx(["mr-2 text-neutral-800", isNavOpen ? "pl-2" : "px-2"])}>
282
334
  groupInfo.icon
@@ -310,11 +362,21 @@ module Make = (Config: RouterConfig) => {
310
362
  isOpen ? "h-auto" : "h-0 overflow-hidden",
311
363
  ])}>
312
364
  {links
313
- ->Array.mapWithIndex((i, link) =>
365
+ ->Array.mapWithIndex((i, link) => {
366
+ let isActive = switch (relativeRoute, link) {
367
+ | (Some(App({route: relativeRoute})), App({route})) =>
368
+ relativeRoute->isRouteEqual(route)
369
+ | _ => false
370
+ }
314
371
  <SingleLink
315
- key={"sidenav-grouped-" ++ i->Int.toString} link isNavOpen isSubLink=true onLinkClick
372
+ key={"sidenav-grouped-" ++ i->Int.toString}
373
+ link
374
+ isNavOpen
375
+ isSubLink=true
376
+ onLinkClick
377
+ isActive
316
378
  />
317
- )
379
+ })
318
380
  ->React.array}
319
381
  </div>
320
382
  </>
@@ -1,2 +1,2 @@
1
1
  @module("@reach/portal") @react.component
2
- external make: (~children: React.element) => React.element = "default"
2
+ external make: (~children: React.element) => React.element = "Portal"
@@ -1,2 +1,2 @@
1
1
  @module("@reach/visually-hidden") @react.component
2
- external make: (~children: React.element) => React.element = "default"
2
+ external make: (~children: React.element) => React.element = "VisuallyHidden"