playbook_ui 14.12.0.pre.alpha.PLAY1888initializeOncereactdatepickerslowdown5956 → 14.12.0.pre.alpha.PLAY18565866
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +3 -10
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -6
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +21 -34
- data/app/pb_kits/playbook/pb_copy_button/_copy_button.scss +1 -2
- data/app/pb_kits/playbook/pb_copy_button/docs/example.yml +3 -3
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +1 -3
- data/app/pb_kits/playbook/pb_drawer/docs/_drawer_breakpoints.jsx +71 -36
- data/app/pb_kits/playbook/pb_drawer/docs/_drawer_menu.jsx +6 -6
- data/app/pb_kits/playbook/pb_drawer/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +11 -7
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting.html.erb +11 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting.jsx +22 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting_rails.md +1 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_formatting_react.md +1 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +11 -2
- data/app/pb_kits/playbook/pb_lightbox/lightbox.scss +6 -7
- data/app/pb_kits/playbook/pb_link/_link.tsx +0 -18
- data/app/pb_kits/playbook/pb_link/docs/example.yml +3 -5
- data/app/pb_kits/playbook/pb_link/docs/index.js +1 -2
- data/app/pb_kits/playbook/pb_link/link.html.erb +1 -1
- data/app/pb_kits/playbook/pb_link/link.rb +0 -6
- data/app/pb_kits/playbook/pb_link/link.test.jsx +0 -30
- data/app/pb_kits/playbook/pb_progress_step/docs/_progress_step_tooltip.html.erb +6 -6
- data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default.html.erb +1 -1
- data/app/pb_kits/playbook/pb_tooltip/index.js +27 -45
- data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +1 -5
- data/dist/chunks/{_typeahead-CkemExmL.js → _typeahead-W0hatdPs.js} +1 -1
- data/dist/chunks/_weekday_stacked-C98LOqgG.js +45 -0
- data/dist/chunks/{lib-DjpLC8uO.js → lib-kMuhBuU7.js} +1 -1
- data/dist/chunks/{pb_form_validation-S56UaHZl.js → pb_form_validation-DBJ0wZuS.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +2 -2
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +10 -14
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ActionBarAnimationHelper.ts +0 -26
- data/app/pb_kits/playbook/pb_copy_button/copy_button.html.erb +0 -15
- data/app/pb_kits/playbook/pb_copy_button/copy_button.rb +0 -28
- data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_default.html.erb +0 -2
- data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_from.html.erb +0 -5
- data/app/pb_kits/playbook/pb_copy_button/index.js +0 -47
- data/app/pb_kits/playbook/pb_link/docs/_link_target.html.erb +0 -15
- data/app/pb_kits/playbook/pb_link/docs/_link_target.jsx +0 -29
- data/dist/chunks/_weekday_stacked-4-ehPAbR.js +0 -45
@@ -2,5 +2,4 @@ export { default as LinkColor } from './_link_color.jsx'
|
|
2
2
|
export { default as LinkUnderline } from './_link_underline.jsx'
|
3
3
|
export { default as LinkIcon } from './_link_icon.jsx'
|
4
4
|
export { default as LinkDisabled } from './_link_disabled.jsx'
|
5
|
-
export { default as LinkTag } from './_link_tag.jsx'
|
6
|
-
export { default as LinkTarget } from './_link_target.jsx'
|
5
|
+
export { default as LinkTag } from './_link_tag.jsx'
|
@@ -11,11 +11,9 @@ module Playbook
|
|
11
11
|
prop :href
|
12
12
|
prop :icon
|
13
13
|
prop :icon_right
|
14
|
-
prop :tabindex
|
15
14
|
prop :tag, type: Playbook::Props::Enum,
|
16
15
|
values: %w[a h1 h2 h3 h4 h5 h6 p span div],
|
17
16
|
default: "a"
|
18
|
-
prop :target
|
19
17
|
prop :text
|
20
18
|
prop :underline, type: Playbook::Props::Boolean,
|
21
19
|
default: false
|
@@ -28,10 +26,6 @@ module Playbook
|
|
28
26
|
text
|
29
27
|
end
|
30
28
|
|
31
|
-
def target_attribute
|
32
|
-
target if target && href
|
33
|
-
end
|
34
|
-
|
35
29
|
private
|
36
30
|
|
37
31
|
def color_class
|
@@ -90,33 +90,3 @@ test('adds icon right', () => {
|
|
90
90
|
const icon = kit.querySelector('.pb_icon_kit')
|
91
91
|
expect(icon).toBeInTheDocument();
|
92
92
|
})
|
93
|
-
|
94
|
-
test('should render target prop', () => {
|
95
|
-
render(
|
96
|
-
<Link
|
97
|
-
data={{ testid: 'target-test' }}
|
98
|
-
href="https://playbook.powerapp.cloud/"
|
99
|
-
target="blank"
|
100
|
-
/>
|
101
|
-
)
|
102
|
-
|
103
|
-
const kit = screen.getByTestId('target-test')
|
104
|
-
|
105
|
-
expect(kit).toHaveAttribute('target', 'blank')
|
106
|
-
})
|
107
|
-
|
108
|
-
|
109
|
-
test('should render child target prop', () => {
|
110
|
-
render(
|
111
|
-
<Link
|
112
|
-
data={{ testid: 'target-test' }}
|
113
|
-
href="https://playbook.powerapp.cloud/"
|
114
|
-
tabIndex={0}
|
115
|
-
target="child"
|
116
|
-
/>
|
117
|
-
)
|
118
|
-
|
119
|
-
const kit = screen.getByTestId('target-test')
|
120
|
-
|
121
|
-
expect(kit).toHaveAttribute('target', 'child')
|
122
|
-
})
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-1", tooltip: "Tooltip for step 1", tooltip_position: "right", step_direction: "horizontal" }) do %>
|
3
3
|
step 1
|
4
4
|
<% end %>
|
5
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-2", tooltip: "Tooltip for step 2",
|
5
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-2", tooltip: "Tooltip for step 2", step_direction: "horizontal" }) do %>
|
6
6
|
step 2
|
7
7
|
<% end %>
|
8
8
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "active", classname: "tooltip-trigger-3", tooltip: "Tooltip for step 3", tooltip_position: "left", step_direction: "horizontal" }) do %>
|
@@ -11,7 +11,7 @@
|
|
11
11
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-4", tooltip: "Tooltip for step 4", tooltip_position: "bottom" }) do %>
|
12
12
|
step 4
|
13
13
|
<% end %>
|
14
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-5", tooltip: "Tooltip for step 5"
|
14
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-5", tooltip: "Tooltip for step 5" }) do %>
|
15
15
|
step 5
|
16
16
|
<% end %>
|
17
17
|
<% end %>
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<br /><br />
|
20
20
|
|
21
21
|
<%= pb_rails("progress_step", props: {orientation: "vertical"}) do %>
|
22
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-6", tooltip: "Tooltip step 1", step_direction: "vertical"
|
22
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-6", tooltip: "Tooltip step 1", step_direction: "vertical" }) do %>
|
23
23
|
<% end %>
|
24
24
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "active", classname: "tooltip-trigger-7", tooltip: "Tooltip step 2", tooltip_position: "left"}) do %>
|
25
25
|
<% end %>
|
@@ -31,10 +31,10 @@
|
|
31
31
|
|
32
32
|
<br /><br>
|
33
33
|
<%= pb_rails("progress_step",props:{ variant:"tracker", icon:true}) do %>
|
34
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-10", tooltip: "The order has been received", step_direction: "horizontal" , tooltip_position: "right"
|
34
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "complete", classname: "tooltip-trigger-10", tooltip: "The order has been received", step_direction: "horizontal" , tooltip_position: "right" }) do %>
|
35
35
|
<%= pb_rails("caption", props:{text: "Ordered"})%>
|
36
36
|
<% end %>
|
37
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "active", classname: "tooltip-trigger-11", tooltip:"Item(s) have been shipped"
|
37
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "active", classname: "tooltip-trigger-11", tooltip:"Item(s) have been shipped" }) do %>
|
38
38
|
<%= pb_rails("caption", props:{text: "Shipped"})%>
|
39
39
|
<% end %>
|
40
40
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-12", tooltip:"This step has not been reached", tooltip_position: "left" }) do %>
|
@@ -50,7 +50,7 @@
|
|
50
50
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "active", icon: "exclamation-triangle", classname: "tooltip-trigger-14", tooltip: "More details needed before shipment", tooltip_position: "bottom" }) do %>
|
51
51
|
<%= pb_rails("caption", props:{text: "Shipped"})%>
|
52
52
|
<% end %>
|
53
|
-
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-15", tooltip: "This step is inactive"
|
53
|
+
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-15", tooltip: "This step is inactive"}) do %>
|
54
54
|
<%= pb_rails("caption", props:{text: "Out for Delivery"})%>
|
55
55
|
<% end %>
|
56
56
|
<%= pb_rails("progress_step/progress_step_item", props: {status: "inactive", classname: "tooltip-trigger-16", tooltip: "Estimated delivery: Jun 27", tooltip_position: "left"}) do %>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import PbEnhancedElement from '../pb_enhanced_element'
|
2
|
+
|
2
3
|
import {
|
3
4
|
createPopperLite as createPopper,
|
4
5
|
flip,
|
@@ -16,34 +17,27 @@ export default class PbTooltip extends PbEnhancedElement {
|
|
16
17
|
|
17
18
|
connect() {
|
18
19
|
this.triggerElements.forEach((trigger) => {
|
19
|
-
|
20
|
-
|
21
|
-
if (method === 'click') {
|
22
|
-
trigger.addEventListener('click', () => {
|
20
|
+
trigger.addEventListener('mouseenter', () => {
|
21
|
+
this.mouseenterTimeout = setTimeout(() => {
|
23
22
|
this.showTooltip(trigger)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
this.showTooltip(trigger)
|
29
|
-
this.checkCloseTooltip(trigger)
|
30
|
-
}, TOOLTIP_TIMEOUT)
|
31
|
-
|
32
|
-
trigger.addEventListener('mouseleave', () => {
|
33
|
-
clearTimeout(this.mouseenterTimeout)
|
34
|
-
setTimeout(() => {
|
35
|
-
this.hideTooltip()
|
36
|
-
}, 0)
|
37
|
-
}, { once: true })
|
38
|
-
})
|
39
|
-
|
40
|
-
this.tooltip.addEventListener('mouseenter', () => {
|
23
|
+
this.checkCloseTooltip(trigger)
|
24
|
+
}, TOOLTIP_TIMEOUT)
|
25
|
+
|
26
|
+
trigger.addEventListener('mouseleave', () => {
|
41
27
|
clearTimeout(this.mouseenterTimeout)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
28
|
+
|
29
|
+
setTimeout(() => {
|
30
|
+
this.hideTooltip()
|
31
|
+
}, 0)
|
32
|
+
}, { once: true })
|
33
|
+
})
|
34
|
+
})
|
35
|
+
|
36
|
+
this.tooltip.addEventListener('mouseenter', () => {
|
37
|
+
clearTimeout(this.mouseenterTimeout)
|
38
|
+
})
|
39
|
+
this.tooltip.addEventListener('mouseleave', () => {
|
40
|
+
this.hideTooltip()
|
47
41
|
})
|
48
42
|
}
|
49
43
|
|
@@ -60,7 +54,7 @@ export default class PbTooltip extends PbEnhancedElement {
|
|
60
54
|
}
|
61
55
|
|
62
56
|
showTooltip(trigger) {
|
63
|
-
if (this.shouldShowTooltip ===
|
57
|
+
if (this.shouldShowTooltip === "false") return
|
64
58
|
|
65
59
|
this.popper = createPopper(trigger, this.tooltip, {
|
66
60
|
placement: this.position,
|
@@ -84,13 +78,6 @@ export default class PbTooltip extends PbEnhancedElement {
|
|
84
78
|
],
|
85
79
|
})
|
86
80
|
this.tooltip.classList.add('show')
|
87
|
-
|
88
|
-
if (this.triggerMethod === 'click') {
|
89
|
-
clearTimeout(this.autoHideTimeout)
|
90
|
-
this.autoHideTimeout = setTimeout(() => {
|
91
|
-
this.hideTooltip()
|
92
|
-
}, 1000)
|
93
|
-
}
|
94
81
|
}
|
95
82
|
|
96
83
|
hideTooltip() {
|
@@ -107,26 +94,25 @@ export default class PbTooltip extends PbEnhancedElement {
|
|
107
94
|
let triggerEl
|
108
95
|
|
109
96
|
if (this.triggerElementId) {
|
110
|
-
triggerEl = document.querySelector(`#${this.triggerElementId}`)
|
97
|
+
triggerEl = document.querySelector(`#${this.triggerElementId}`) //deprecated
|
111
98
|
} else {
|
112
99
|
const selectorIsId = this.triggerElementSelector.indexOf('#') > -1
|
113
|
-
triggerEl = selectorIsId
|
114
|
-
|
115
|
-
: document.querySelectorAll(`${this.triggerElementSelector}`)
|
100
|
+
triggerEl = selectorIsId ? document.querySelector(`${this.triggerElementSelector}`) :
|
101
|
+
document.querySelectorAll(`${this.triggerElementSelector}`)
|
116
102
|
}
|
117
103
|
|
118
104
|
if (!triggerEl) {
|
105
|
+
/* eslint no-console: ["error", { allow: ["warn", "error"] }] */
|
119
106
|
console.error('Tooltip Kit: an invalid or unavailable DOM reference was provided!')
|
120
107
|
return []
|
121
108
|
}
|
122
109
|
|
123
110
|
if (!triggerEl.length) triggerEl = [triggerEl]
|
124
|
-
return
|
111
|
+
return this._triggerElements = (this._triggerElements || triggerEl)
|
125
112
|
}
|
126
113
|
|
127
114
|
get tooltip() {
|
128
|
-
return (this._tooltip
|
129
|
-
this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
|
115
|
+
return this._tooltip = (this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
|
130
116
|
}
|
131
117
|
|
132
118
|
get position() {
|
@@ -148,8 +134,4 @@ export default class PbTooltip extends PbEnhancedElement {
|
|
148
134
|
get shouldShowTooltip() {
|
149
135
|
return this.element.dataset.pbTooltipShowTooltip
|
150
136
|
}
|
151
|
-
|
152
|
-
get triggerMethod() {
|
153
|
-
return this.element.dataset.pbTooltipTriggerMethod || 'hover'
|
154
|
-
}
|
155
137
|
}
|
@@ -9,9 +9,6 @@ module Playbook
|
|
9
9
|
prop :tooltip_id
|
10
10
|
prop :dark, type: Playbook::Props::Boolean,
|
11
11
|
default: false
|
12
|
-
prop :trigger_method, type: Playbook::Props::Enum,
|
13
|
-
values: %w[hover click],
|
14
|
-
default: "hover"
|
15
12
|
|
16
13
|
def classname
|
17
14
|
generate_classname("pb_tooltip_kit", dark_class)
|
@@ -24,8 +21,7 @@ module Playbook
|
|
24
21
|
pb_tooltip_trigger_element_selector: trigger_element_selector,
|
25
22
|
pb_tooltip_trigger_element_id: trigger_element_id,
|
26
23
|
pb_tooltip_tooltip_id: tooltip_id,
|
27
|
-
pb_tooltip_show_tooltip: true
|
28
|
-
pb_tooltip_trigger_method: trigger_method
|
24
|
+
pb_tooltip_show_tooltip: true
|
29
25
|
)
|
30
26
|
end
|
31
27
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import{jsx as jsx$1,Fragment,jsxs}from"react/jsx-runtime";import*as React from"react";import React__default,{createContext,useReducer,useEffect,useMemo,useContext,useRef,createElement,useState,useLayoutEffect,forwardRef,useCallback,useImperativeHandle,Component,Fragment as Fragment$1}from"react";import{r as getDefaultExportFromCjs,x as filter,y as omit,u as useCollapsible,z as get,j as getAllIcons,q as commonjsGlobal,w as colors$1,t as highchartsTheme,A as merge,s as highchartsDarkTheme,B as getAugmentedNamespace,C as createPopper,E as uniqueId,F as typography,G as cloneDeep,H as isString}from"./lib-
|
1
|
+
import{jsx as jsx$1,Fragment,jsxs}from"react/jsx-runtime";import*as React from"react";import React__default,{createContext,useReducer,useEffect,useMemo,useContext,useRef,createElement,useState,useLayoutEffect,forwardRef,useCallback,useImperativeHandle,Component,Fragment as Fragment$1}from"react";import{r as getDefaultExportFromCjs,x as filter,y as omit,u as useCollapsible,z as get,j as getAllIcons,q as commonjsGlobal,w as colors$1,t as highchartsTheme,A as merge,s as highchartsDarkTheme,B as getAugmentedNamespace,C as createPopper,E as uniqueId,F as typography,G as cloneDeep,H as isString}from"./lib-kMuhBuU7.js";import*as ReactDOM from"react-dom";import ReactDOM__default,{createPortal}from"react-dom";import{TrixEditor}from"react-trix";import Trix from"trix";import require$$0 from"react-is";const initialState={items:[],dragData:{id:"",initialGroup:""},isDragging:"",activeContainer:""};const reducer=(state,action)=>{switch(action.type){case"SET_ITEMS":return Object.assign(Object.assign({},state),{items:action.payload});case"SET_DRAG_DATA":return Object.assign(Object.assign({},state),{dragData:action.payload});case"SET_IS_DRAGGING":return Object.assign(Object.assign({},state),{isDragging:action.payload});case"SET_ACTIVE_CONTAINER":return Object.assign(Object.assign({},state),{activeContainer:action.payload});case"CHANGE_CATEGORY":return Object.assign(Object.assign({},state),{items:state.items.map((item=>item.id===action.payload.itemId?Object.assign(Object.assign({},item),{container:action.payload.container}):item))});case"REORDER_ITEMS":{const{dragId:dragId,targetId:targetId}=action.payload;const newItems=[...state.items];const draggedItem=newItems.find((item=>item.id===dragId));const draggedIndex=newItems.indexOf(draggedItem);const targetIndex=newItems.findIndex((item=>item.id===targetId));newItems.splice(draggedIndex,1);newItems.splice(targetIndex,0,draggedItem);return Object.assign(Object.assign({},state),{items:newItems})}default:return state}};const DragContext=createContext({});const DraggableContext=()=>useContext(DragContext);const DraggableProvider=({children:children,initialItems:initialItems,onReorder:onReorder,onDragStart:onDragStart,onDragEnter:onDragEnter,onDragEnd:onDragEnd,onDrop:onDrop,onDragOver:onDragOver})=>{const[state,dispatch]=useReducer(reducer,initialState);useEffect((()=>{dispatch({type:"SET_ITEMS",payload:initialItems})}),[initialItems]);useEffect((()=>{onReorder(state.items)}),[state.items]);const handleDragStart=(id,container)=>{dispatch({type:"SET_DRAG_DATA",payload:{id:id,initialGroup:container}});dispatch({type:"SET_IS_DRAGGING",payload:id});if(onDragStart)onDragStart(id,container)};const handleDragEnter=(id,container)=>{if(state.dragData.id!==id){dispatch({type:"REORDER_ITEMS",payload:{dragId:state.dragData.id,targetId:id}});dispatch({type:"SET_DRAG_DATA",payload:{id:state.dragData.id,initialGroup:container}})}if(onDragEnter)onDragEnter(id,container)};const handleDragEnd=()=>{dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});if(onDragEnd)onDragEnd()};const changeCategory=(itemId,container)=>{dispatch({type:"CHANGE_CATEGORY",payload:{itemId:itemId,container:container}})};const handleDrop=container=>{dispatch({type:"SET_IS_DRAGGING",payload:""});dispatch({type:"SET_ACTIVE_CONTAINER",payload:""});changeCategory(state.dragData.id,container);if(onDrop)onDrop(container)};const handleDragOver=(e,container)=>{e.preventDefault();dispatch({type:"SET_ACTIVE_CONTAINER",payload:container});if(onDragOver)onDragOver(e,container)};const contextValue=useMemo((()=>({items:state.items,dragData:state.dragData,isDragging:state.isDragging,activeContainer:state.activeContainer,handleDragStart:handleDragStart,handleDragEnter:handleDragEnter,handleDragEnd:handleDragEnd,handleDrop:handleDrop,handleDragOver:handleDragOver})),[state]);return jsx$1(DragContext.Provider,Object.assign({value:contextValue},{children:children}),void 0)};var classnames$1={exports:{}};
|
2
2
|
/*!
|
3
3
|
Copyright (c) 2018 Jed Watson.
|
4
4
|
Licensed under the MIT License (MIT), see
|