etudes 1.2.0 → 2.1.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.
Files changed (126) hide show
  1. package/README.md +1 -1
  2. package/lib/Accordion.d.ts +80 -71
  3. package/lib/Accordion.js +173 -183
  4. package/lib/Accordion.js.map +1 -1
  5. package/lib/BurgerButton.d.ts +20 -7
  6. package/lib/BurgerButton.js +113 -20
  7. package/lib/BurgerButton.js.map +1 -1
  8. package/lib/Conditional.d.ts +2 -3
  9. package/lib/Conditional.js +0 -1
  10. package/lib/Conditional.js.map +1 -1
  11. package/lib/DebugConsole.d.ts +14 -23
  12. package/lib/DebugConsole.js +86 -87
  13. package/lib/DebugConsole.js.map +1 -1
  14. package/lib/Dial.d.ts +53 -16
  15. package/lib/Dial.js +121 -35
  16. package/lib/Dial.js.map +1 -1
  17. package/lib/Dropdown.d.ts +68 -83
  18. package/lib/Dropdown.js +226 -161
  19. package/lib/Dropdown.js.map +1 -1
  20. package/lib/Each.d.ts +2 -2
  21. package/lib/Each.js.map +1 -1
  22. package/lib/ExtractChild.d.ts +5 -4
  23. package/lib/ExtractChild.js +13 -11
  24. package/lib/ExtractChild.js.map +1 -1
  25. package/lib/ExtractChildren.d.ts +2 -2
  26. package/lib/ExtractChildren.js +7 -5
  27. package/lib/ExtractChildren.js.map +1 -1
  28. package/lib/FlatSVG.d.ts +30 -25
  29. package/lib/FlatSVG.js +28 -37
  30. package/lib/FlatSVG.js.map +1 -1
  31. package/lib/List.d.ts +97 -54
  32. package/lib/List.js +124 -63
  33. package/lib/List.js.map +1 -1
  34. package/lib/MasonryGrid.d.ts +27 -15
  35. package/lib/MasonryGrid.js +163 -148
  36. package/lib/MasonryGrid.js.map +1 -1
  37. package/lib/Panorama.d.ts +100 -21
  38. package/lib/Panorama.js +45 -44
  39. package/lib/Panorama.js.map +1 -1
  40. package/lib/PanoramaSlider.d.ts +65 -23
  41. package/lib/PanoramaSlider.js +150 -45
  42. package/lib/PanoramaSlider.js.map +1 -1
  43. package/lib/RangeSlider.d.ts +29 -89
  44. package/lib/RangeSlider.js +272 -286
  45. package/lib/RangeSlider.js.map +1 -1
  46. package/lib/Repeat.d.ts +4 -3
  47. package/lib/Repeat.js +3 -2
  48. package/lib/Repeat.js.map +1 -1
  49. package/lib/RotatingGallery.d.ts +38 -36
  50. package/lib/RotatingGallery.js +47 -17
  51. package/lib/RotatingGallery.js.map +1 -1
  52. package/lib/SelectableButton.d.ts +13 -4
  53. package/lib/SelectableButton.js +3 -14
  54. package/lib/SelectableButton.js.map +1 -1
  55. package/lib/Slider.d.ts +103 -41
  56. package/lib/Slider.js +182 -82
  57. package/lib/Slider.js.map +1 -1
  58. package/lib/StepwiseSlider.d.ts +146 -59
  59. package/lib/StepwiseSlider.js +248 -142
  60. package/lib/StepwiseSlider.js.map +1 -1
  61. package/lib/SwipeContainer.d.ts +13 -5
  62. package/lib/SwipeContainer.js +5 -15
  63. package/lib/SwipeContainer.js.map +1 -1
  64. package/lib/TextField.d.ts +1 -1
  65. package/lib/TextField.js +5 -15
  66. package/lib/TextField.js.map +1 -1
  67. package/lib/Video.d.ts +30 -51
  68. package/lib/Video.js +77 -119
  69. package/lib/Video.js.map +1 -1
  70. package/lib/WithTooltip.d.ts +16 -18
  71. package/lib/WithTooltip.js +167 -101
  72. package/lib/WithTooltip.js.map +1 -1
  73. package/lib/hooks/useDocumentTitle.d.ts +2 -1
  74. package/lib/hooks/useDocumentTitle.js +2 -1
  75. package/lib/hooks/useDocumentTitle.js.map +1 -1
  76. package/lib/hooks/useDragEffect.d.ts +26 -17
  77. package/lib/hooks/useDragEffect.js +30 -20
  78. package/lib/hooks/useDragEffect.js.map +1 -1
  79. package/lib/hooks/useElementRect.d.ts +2 -1
  80. package/lib/hooks/useElementRect.js +5 -4
  81. package/lib/hooks/useElementRect.js.map +1 -1
  82. package/lib/hooks/useInterval.d.ts +3 -3
  83. package/lib/hooks/useInterval.js +1 -1
  84. package/lib/hooks/useInterval.js.map +1 -1
  85. package/lib/hooks/useLoadImageEffect.d.ts +8 -8
  86. package/lib/hooks/useLoadImageEffect.js.map +1 -1
  87. package/lib/hooks/usePrevious.d.ts +6 -0
  88. package/lib/hooks/usePrevious.js +17 -0
  89. package/lib/hooks/usePrevious.js.map +1 -0
  90. package/lib/hooks/useResizeEffect.d.ts +3 -3
  91. package/lib/hooks/useResizeEffect.js +5 -8
  92. package/lib/hooks/useResizeEffect.js.map +1 -1
  93. package/lib/hooks/useSearchParamState.d.ts +11 -8
  94. package/lib/hooks/useSearchParamState.js +14 -10
  95. package/lib/hooks/useSearchParamState.js.map +1 -1
  96. package/lib/providers/I18nProvider.d.ts +179 -0
  97. package/lib/providers/I18nProvider.js +470 -0
  98. package/lib/providers/I18nProvider.js.map +1 -0
  99. package/lib/providers/ScrollPositionProvider.d.ts +15 -0
  100. package/lib/providers/ScrollPositionProvider.js +112 -0
  101. package/lib/providers/ScrollPositionProvider.js.map +1 -0
  102. package/lib/utils/asClassNameDict.d.ts +3 -0
  103. package/lib/utils/asClassNameDict.js +7 -0
  104. package/lib/utils/asClassNameDict.js.map +1 -0
  105. package/lib/utils/asComponentDict.d.ts +5 -0
  106. package/lib/utils/asComponentDict.js +23 -0
  107. package/lib/utils/asComponentDict.js.map +1 -0
  108. package/lib/utils/asStyleDict.d.ts +4 -0
  109. package/lib/utils/asStyleDict.js +7 -0
  110. package/lib/utils/asStyleDict.js.map +1 -0
  111. package/lib/utils/cloneStyledElement.d.ts +18 -0
  112. package/lib/utils/cloneStyledElement.js +63 -0
  113. package/lib/utils/cloneStyledElement.js.map +1 -0
  114. package/lib/utils/styles.d.ts +2 -0
  115. package/lib/utils/styles.js +22 -0
  116. package/lib/utils/styles.js.map +1 -0
  117. package/lib/utils/useDebug.d.ts +2 -0
  118. package/lib/utils/useDebug.js +46 -0
  119. package/lib/utils/useDebug.js.map +1 -0
  120. package/package.json +31 -38
  121. package/lib/AbstractSelectableCollection.d.ts +0 -94
  122. package/lib/AbstractSelectableCollection.js +0 -151
  123. package/lib/AbstractSelectableCollection.js.map +0 -1
  124. package/lib/types/index.d.ts +0 -7
  125. package/lib/types/index.js +0 -3
  126. package/lib/types/index.js.map +0 -1
@@ -1,23 +1,4 @@
1
1
  "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
18
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
19
- return cooked;
20
- };
21
2
  var __assign = (this && this.__assign) || function () {
22
3
  __assign = Object.assign || function(t) {
23
4
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -52,6 +33,17 @@ var __importStar = (this && this.__importStar) || function (mod) {
52
33
  __setModuleDefault(result, mod);
53
34
  return result;
54
35
  };
36
+ var __rest = (this && this.__rest) || function (s, e) {
37
+ var t = {};
38
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
39
+ t[p] = s[p];
40
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
41
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
42
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
43
+ t[p[i]] = s[p[i]];
44
+ }
45
+ return t;
46
+ };
55
47
  var __read = (this && this.__read) || function (o, n) {
56
48
  var m = typeof Symbol === "function" && o[Symbol.iterator];
57
49
  if (!m) return o;
@@ -82,75 +74,82 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
82
74
  };
83
75
  Object.defineProperty(exports, "__esModule", { value: true });
84
76
  var react_1 = __importStar(require("react"));
85
- var styled_components_1 = __importDefault(require("styled-components"));
86
- var DebugConsole = /** @class */ (function (_super) {
87
- __extends(DebugConsole, _super);
88
- function DebugConsole(props) {
89
- var _this = _super.call(this, props) || this;
90
- _this.nodeRefs = {
91
- messages: (0, react_1.createRef)(),
92
- };
93
- _this.state = {
94
- messages: _this.props.message ? [_this.props.message] : [],
95
- };
96
- return _this;
97
- }
98
- DebugConsole.prototype.componentDidUpdate = function (prevProps, prevState) {
99
- var _a, _b, _c, _d;
100
- if (prevProps.message !== this.props.message) {
101
- this.push((_a = this.props.message) !== null && _a !== void 0 ? _a : '');
102
- }
103
- if (prevState.messages.length !== this.state.messages.length) {
104
- var m = (_c = (_b = this.nodeRefs.messages.current) === null || _b === void 0 ? void 0 : _b.scrollHeight) !== null && _c !== void 0 ? _c : 0;
105
- (_d = this.nodeRefs.messages.current) === null || _d === void 0 ? void 0 : _d.scrollTo(0, m);
106
- }
107
- };
108
- DebugConsole.prototype.push = function (message) {
109
- if (this.props.maxEntries < 0) {
110
- this.setState({
111
- messages: __spreadArray(__spreadArray([], __read(this.state.messages), false), [message], false),
112
- });
77
+ var Each_1 = __importDefault(require("./Each"));
78
+ var asStyleDict_1 = __importDefault(require("./utils/asStyleDict"));
79
+ var styles_1 = __importDefault(require("./utils/styles"));
80
+ exports.default = (0, react_1.forwardRef)(function (_a, ref) {
81
+ var _b = _a.align, align = _b === void 0 ? 'br' : _b, _c = _a.margin, margin = _c === void 0 ? 0 : _c, _d = _a.maxEntries, maxEntries = _d === void 0 ? -1 : _d, message = _a.message, _e = _a.style, style = _e === void 0 ? {} : _e, title = _a.title, props = __rest(_a, ["align", "margin", "maxEntries", "message", "style", "title"]);
82
+ var _f = __read((0, react_1.useState)([]), 2), messages = _f[0], setMessages = _f[1];
83
+ var messagesRef = (0, react_1.useRef)(null);
84
+ (0, react_1.useEffect)(function () {
85
+ if (message === undefined) {
86
+ setMessages([]);
113
87
  }
114
88
  else {
115
- var n = this.state.messages.length;
116
- this.setState({
117
- messages: __spreadArray(__spreadArray([], __read(this.state.messages.slice(Math.max(0, n - (this.props.maxEntries - 1)), n)), false), [message], false),
118
- });
89
+ var numMessages = messages.length;
90
+ setMessages(__spreadArray(__spreadArray([], __read(maxEntries < 0
91
+ ? messages
92
+ : messages.slice(Math.max(0, numMessages - (maxEntries - 1)), numMessages)), false), [
93
+ message,
94
+ ], false));
119
95
  }
120
- };
121
- DebugConsole.prototype.clear = function () {
122
- this.setState({
123
- messages: [],
124
- });
125
- };
126
- DebugConsole.prototype.render = function () {
127
- var _a;
128
- return (react_1.default.createElement(StyledRoot, { className: this.props.className, style: __assign(__assign(__assign({}, this.props.style), { margin: 0, position: 'fixed' }), this.getStyleByAlignment(this.props.align)) },
129
- react_1.default.createElement("h6", null, (_a = this.props.title) !== null && _a !== void 0 ? _a : 'Untitled'),
130
- react_1.default.createElement("div", { ref: this.nodeRefs.messages }, this.state.messages.map(function (v, i) { return (react_1.default.createElement("span", { key: "item-".concat(i), dangerouslySetInnerHTML: { __html: v } })); }))));
131
- };
132
- DebugConsole.prototype.getStyleByAlignment = function (align) {
133
- switch (align) {
134
- case 'tl': return { top: "".concat(this.props.margin, "px"), left: "".concat(this.props.margin, "px") };
135
- case 'tc': return { top: "".concat(this.props.margin, "px"), left: 0, right: 0, margin: '0 auto' };
136
- case 'tr': return { top: "".concat(this.props.margin, "px"), right: "".concat(this.props.margin, "px") };
137
- case 'cl': return { top: 0, left: "".concat(this.props.margin, "px"), bottom: 0, margin: 'auto 0' };
138
- case 'cc': return { top: 0, left: 0, right: 0, bottom: 0, margin: 'auto' };
139
- case 'cr': return { top: 0, bottom: 0, right: "".concat(this.props.margin, "px"), margin: 'auto 0' };
140
- case 'bl': return { bottom: "".concat(this.props.margin, "px"), left: "".concat(this.props.margin, "px") };
141
- case 'bc': return { bottom: "".concat(this.props.margin, "px"), left: 0, right: 0, margin: '0 auto' };
142
- default: return { bottom: "".concat(this.props.margin, "px"), right: "".concat(this.props.margin, "px") };
143
- }
144
- };
145
- DebugConsole.defaultProps = {
146
- align: 'br',
147
- margin: 0,
148
- maxEntries: -1,
149
- style: {},
150
- };
151
- return DebugConsole;
152
- }(react_1.PureComponent));
153
- exports.default = DebugConsole;
154
- var StyledRoot = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n align-items: flex-start;\n background: #000;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n font-family: monospace;\n justify-content: flex-start;\n max-height: 20rem;\n min-height: 10rem;\n width: 300px;\n\n h6 {\n background: #fff;\n color: #000;\n flex: 0 0 auto;\n font-size: 20px;\n font-weight: 700;\n overflow: hidden;\n padding: 10px;\n text-overflow: ellipsis;\n text-transform: uppercase;\n white-space: nowrap;\n width: 100%;\n }\n\n > div {\n -webkit-overflow-scrolling: touch;\n align-items: flex-start;\n box-sizing: border-box;\n color: #fff;\n display: flex;\n flex-direction: column;\n font-size: 14px;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: scroll;\n padding: 10px 20px;\n width: 100%;\n\n > span:not(:last-child) {\n margin-bottom: 2px;\n }\n }\n"], ["\n align-items: flex-start;\n background: #000;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n font-family: monospace;\n justify-content: flex-start;\n max-height: 20rem;\n min-height: 10rem;\n width: 300px;\n\n h6 {\n background: #fff;\n color: #000;\n flex: 0 0 auto;\n font-size: 20px;\n font-weight: 700;\n overflow: hidden;\n padding: 10px;\n text-overflow: ellipsis;\n text-transform: uppercase;\n white-space: nowrap;\n width: 100%;\n }\n\n > div {\n -webkit-overflow-scrolling: touch;\n align-items: flex-start;\n box-sizing: border-box;\n color: #fff;\n display: flex;\n flex-direction: column;\n font-size: 14px;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: scroll;\n padding: 10px 20px;\n width: 100%;\n\n > span:not(:last-child) {\n margin-bottom: 2px;\n }\n }\n"])));
155
- var templateObject_1;
96
+ }, [message]);
97
+ (0, react_1.useEffect)(function () {
98
+ var _a, _b;
99
+ (_a = messagesRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo(0, (_b = messagesRef.current) === null || _b === void 0 ? void 0 : _b.scrollHeight);
100
+ }, [messages]);
101
+ var fixedStyles = (0, asStyleDict_1.default)({
102
+ root: {
103
+ background: '#000',
104
+ fontFamily: 'monospace',
105
+ position: 'fixed',
106
+ width: '300px',
107
+ },
108
+ title: {
109
+ background: '#fff',
110
+ boxSizing: 'border-box',
111
+ color: '#000',
112
+ fontSize: '14px',
113
+ fontWeight: '700',
114
+ height: '30px',
115
+ lineHeight: '30px',
116
+ overflow: 'hidden',
117
+ padding: '0 10px',
118
+ textOverflow: 'ellipsis',
119
+ textTransform: 'uppercase',
120
+ whiteSpace: 'nowrap',
121
+ width: '100%',
122
+ },
123
+ messages: {
124
+ boxSizing: 'border-box',
125
+ color: '#fff',
126
+ fontSize: '12px',
127
+ lineHeight: '150%',
128
+ maxHeight: '200px',
129
+ minHeight: '100px',
130
+ overflowX: 'hidden',
131
+ overflowY: 'scroll',
132
+ padding: '10px',
133
+ WebkitOverflowScrolling: 'touch',
134
+ width: '100%',
135
+ },
136
+ });
137
+ return (react_1.default.createElement("div", __assign({}, props, { ref: ref, style: (0, styles_1.default)(style, fixedStyles.root, getStyleByAlignment(align, margin)) }),
138
+ react_1.default.createElement("div", { style: fixedStyles.title }, title !== null && title !== void 0 ? title : 'Untitled'),
139
+ react_1.default.createElement("div", { ref: messagesRef, style: fixedStyles.messages },
140
+ react_1.default.createElement(Each_1.default, { in: messages, render: function (msg) { return react_1.default.createElement("div", { dangerouslySetInnerHTML: { __html: msg } }); } }))));
141
+ });
142
+ function getStyleByAlignment(align, margin) {
143
+ switch (align) {
144
+ case 'tl': return { top: "".concat(margin, "px"), left: "".concat(margin, "px") };
145
+ case 'tc': return { top: "".concat(margin, "px"), left: 0, right: 0, margin: '0 auto' };
146
+ case 'tr': return { top: "".concat(margin, "px"), right: "".concat(margin, "px") };
147
+ case 'cl': return { top: 0, left: "".concat(margin, "px"), bottom: 0, margin: 'auto 0' };
148
+ case 'cc': return { top: 0, left: 0, right: 0, bottom: 0, margin: 'auto' };
149
+ case 'cr': return { top: 0, bottom: 0, right: "".concat(margin, "px"), margin: 'auto 0' };
150
+ case 'bl': return { bottom: "".concat(margin, "px"), left: "".concat(margin, "px") };
151
+ case 'bc': return { bottom: "".concat(margin, "px"), left: 0, right: 0, margin: '0 auto' };
152
+ default: return { bottom: "".concat(margin, "px"), right: "".concat(margin, "px") };
153
+ }
154
+ }
156
155
  //# sourceMappingURL=DebugConsole.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DebugConsole.js","sourceRoot":"/","sources":["DebugConsole.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createRef, CSSProperties, PureComponent } from 'react'\nimport styled from 'styled-components'\n\nexport interface Props {\n className?: string\n style: CSSProperties\n margin: number\n maxEntries: number\n align: 'tl' | 'tc' | 'tr' | 'cl' | 'cc' | 'cr' | 'bl' | 'bc' | 'br'\n message?: string\n title?: string\n}\n\nexport interface State {\n messages: string[]\n}\n\nexport default class DebugConsole extends PureComponent<Props, State> {\n static defaultProps: Partial<Props> = {\n align: 'br',\n margin: 0,\n maxEntries: -1,\n style: {},\n }\n\n nodeRefs = {\n messages: createRef<HTMLDivElement>(),\n }\n\n constructor(props: Props) {\n super(props)\n\n this.state = {\n messages: this.props.message ? [this.props.message] : [],\n }\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n if (prevProps.message !== this.props.message) {\n this.push(this.props.message ?? '')\n }\n\n if (prevState.messages.length !== this.state.messages.length) {\n const m = this.nodeRefs.messages.current?.scrollHeight ?? 0\n this.nodeRefs.messages.current?.scrollTo(0, m)\n }\n }\n\n push(message: string) {\n if (this.props.maxEntries < 0) {\n this.setState({\n messages: [...this.state.messages, message],\n })\n }\n else {\n const n = this.state.messages.length\n\n this.setState({\n messages: [...this.state.messages.slice(Math.max(0, n - (this.props.maxEntries - 1)), n), message],\n })\n }\n }\n\n clear() {\n this.setState({\n messages: [],\n })\n }\n\n render() {\n return (\n <StyledRoot\n className={this.props.className}\n style={{\n ...this.props.style,\n margin: 0,\n position: 'fixed',\n ...this.getStyleByAlignment(this.props.align),\n }}\n >\n <h6>{this.props.title ?? 'Untitled'}</h6>\n <div ref={this.nodeRefs.messages}>\n {this.state.messages.map((v, i) => (\n <span key={`item-${i}`} dangerouslySetInnerHTML={{ __html: v }}/>\n ))}\n </div>\n </StyledRoot>\n )\n }\n\n private getStyleByAlignment(align: Props['align']): CSSProperties {\n switch (align) {\n case 'tl': return { top: `${this.props.margin}px`, left: `${this.props.margin}px` }\n case 'tc': return { top: `${this.props.margin}px`, left: 0, right: 0, margin: '0 auto' }\n case 'tr': return { top: `${this.props.margin}px`, right: `${this.props.margin}px` }\n case 'cl': return { top: 0, left: `${this.props.margin}px`, bottom: 0, margin: 'auto 0' }\n case 'cc': return { top: 0, left: 0, right: 0, bottom: 0, margin: 'auto' }\n case 'cr': return { top: 0, bottom: 0, right: `${this.props.margin}px`, margin: 'auto 0' }\n case 'bl': return { bottom: `${this.props.margin}px`, left: `${this.props.margin}px` }\n case 'bc': return { bottom: `${this.props.margin}px`, left: 0, right: 0, margin: '0 auto' }\n default: return { bottom: `${this.props.margin}px`, right: `${this.props.margin}px` }\n }\n }\n}\n\nconst StyledRoot = styled.div`\n align-items: flex-start;\n background: #000;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n font-family: monospace;\n justify-content: flex-start;\n max-height: 20rem;\n min-height: 10rem;\n width: 300px;\n\n h6 {\n background: #fff;\n color: #000;\n flex: 0 0 auto;\n font-size: 20px;\n font-weight: 700;\n overflow: hidden;\n padding: 10px;\n text-overflow: ellipsis;\n text-transform: uppercase;\n white-space: nowrap;\n width: 100%;\n }\n\n > div {\n -webkit-overflow-scrolling: touch;\n align-items: flex-start;\n box-sizing: border-box;\n color: #fff;\n display: flex;\n flex-direction: column;\n font-size: 14px;\n justify-content: flex-start;\n overflow-x: hidden;\n overflow-y: scroll;\n padding: 10px 20px;\n width: 100%;\n\n > span:not(:last-child) {\n margin-bottom: 2px;\n }\n }\n`\n"]}
1
+ {"version":3,"file":"DebugConsole.js","sourceRoot":"/","sources":["DebugConsole.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { CSSProperties, forwardRef, HTMLAttributes, useEffect, useRef, useState } from 'react'\nimport Each from './Each'\nimport asStyleDict from './utils/asStyleDict'\nimport styles from './utils/styles'\n\nexport type DebugConsoleProps = HTMLAttributes<HTMLDivElement> & {\n align?: 'tl' | 'tc' | 'tr' | 'cl' | 'cc' | 'cr' | 'bl' | 'bc' | 'br'\n margin?: number\n maxEntries?: number\n message?: string\n title?: string\n}\n\nexport default forwardRef<HTMLDivElement, DebugConsoleProps>(({\n align = 'br',\n margin = 0,\n maxEntries = -1,\n message,\n style = {},\n title,\n ...props\n}, ref) => {\n const [messages, setMessages] = useState<string[]>([])\n const messagesRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (message === undefined) {\n setMessages([])\n }\n else {\n const numMessages = messages.length\n\n setMessages([\n ...maxEntries < 0\n ? messages\n : messages.slice(Math.max(0, numMessages - (maxEntries - 1)), numMessages),\n message,\n ])\n }\n }, [message])\n\n useEffect(() => {\n messagesRef.current?.scrollTo(0, messagesRef.current?.scrollHeight)\n }, [messages])\n\n const fixedStyles = asStyleDict({\n root: {\n background: '#000',\n fontFamily: 'monospace',\n position: 'fixed',\n width: '300px',\n },\n title: {\n background: '#fff',\n boxSizing: 'border-box',\n color: '#000',\n fontSize: '14px',\n fontWeight: '700',\n height: '30px',\n lineHeight: '30px',\n overflow: 'hidden',\n padding: '0 10px',\n textOverflow: 'ellipsis',\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n width: '100%',\n },\n messages: {\n boxSizing: 'border-box',\n color: '#fff',\n fontSize: '12px',\n lineHeight: '150%',\n maxHeight: '200px',\n minHeight: '100px',\n overflowX: 'hidden',\n overflowY: 'scroll',\n padding: '10px',\n WebkitOverflowScrolling: 'touch',\n width: '100%',\n },\n })\n\n return (\n <div\n {...props}\n ref={ref}\n style={styles(style, fixedStyles.root, getStyleByAlignment(align, margin))}\n >\n <div style={fixedStyles.title}>{title ?? 'Untitled'}</div>\n <div ref={messagesRef} style={fixedStyles.messages}>\n <Each in={messages} render={msg => <div dangerouslySetInnerHTML={{ __html: msg }}/>}/>\n </div>\n </div>\n )\n})\n\nfunction getStyleByAlignment(align: DebugConsoleProps['align'], margin: number): CSSProperties {\n switch (align) {\n case 'tl': return { top: `${margin}px`, left: `${margin}px` }\n case 'tc': return { top: `${margin}px`, left: 0, right: 0, margin: '0 auto' }\n case 'tr': return { top: `${margin}px`, right: `${margin}px` }\n case 'cl': return { top: 0, left: `${margin}px`, bottom: 0, margin: 'auto 0' }\n case 'cc': return { top: 0, left: 0, right: 0, bottom: 0, margin: 'auto' }\n case 'cr': return { top: 0, bottom: 0, right: `${margin}px`, margin: 'auto 0' }\n case 'bl': return { bottom: `${margin}px`, left: `${margin}px` }\n case 'bc': return { bottom: `${margin}px`, left: 0, right: 0, margin: '0 auto' }\n default: return { bottom: `${margin}px`, right: `${margin}px` }\n }\n}\n"]}
package/lib/Dial.d.ts CHANGED
@@ -1,16 +1,17 @@
1
- import { HTMLAttributes } from 'react';
2
- export declare type Props = HTMLAttributes<HTMLDivElement> & {
1
+ import React, { HTMLAttributes, PropsWithChildren, SVGAttributes } from 'react';
2
+ export type DialProps = HTMLAttributes<HTMLDivElement> & PropsWithChildren<{
3
3
  /**
4
- * Current angle reading of the compass, between 0.0 - 360.0 degrees, inclusive.
4
+ * Current angle reading of the compass, between 0.0 - 360.0 degrees,
5
+ * inclusive.
5
6
  */
6
7
  angle?: number;
7
8
  /**
8
- * Length of the knob along the track expressed in degrees, between 0.0 and 360.0 degrees,
9
- * exclusive. If set to 0 or 360, the knob disappears.
9
+ * Length of the knob along the track expressed in degrees, between 0.0 and
10
+ * 360.0 degrees, exclusive. If set to 0 or 360, the knob disappears.
10
11
  *
11
- * @example Suppose the compass were to be used to control a photosphere of an image that is 1000
12
- * x 500, and the window size is 500 x 500, that would mean the FOV is 500 / 1000 * 360 =
13
- * 180 degrees.
12
+ * @example Suppose the compass were to be used to control a photosphere of an
13
+ * image that is 1000 x 500, and the window size is 500 x 500, that
14
+ * would mean the FOV is 500 / 1000 * 360 = 180 degrees.
14
15
  */
15
16
  knobLength?: number;
16
17
  /**
@@ -18,22 +19,58 @@ export declare type Props = HTMLAttributes<HTMLDivElement> & {
18
19
  */
19
20
  radius?: number;
20
21
  /**
21
- * The thickness of the knob, which is equivalent to the `stroke-width` of the `<path>` element.
22
- * Note that this overwrites the `stroke-width` set inside `cssKnob`.
22
+ * The thickness of the knob, which is equivalent to the `stroke-width` of the
23
+ * `<path>` element. Note that this overwrites the `stroke-width` set inside
24
+ * `cssKnob`.
23
25
  */
24
26
  knobThickness?: number;
25
27
  /**
26
- * The thickness of the circular track, which is equivalent to the `stroke-width` of the
27
- * `<circle>` element. Note that this overwrites the `stroke-width` set inside `cssTrack`.
28
+ * The thickness of the circular track, which is equivalent to the
29
+ * `stroke-width` of the `<circle>` element. Note that this overwrites the
30
+ * `stroke-width` set inside `cssTrack`.
28
31
  */
29
32
  trackThickness?: number;
30
- };
33
+ }>;
31
34
  /**
32
35
  * A circular dial with a knob and a track.
33
36
  *
34
37
  * @exports DialKnob
35
38
  * @exports DialTrack
36
39
  */
37
- export default function Dial({ angle, radius, knobLength, knobThickness, trackThickness, style, ...props }: Props): JSX.Element;
38
- export declare const DialTrack: import("styled-components").StyledComponent<"circle", any, {}, never>;
39
- export declare const DialKnob: import("styled-components").StyledComponent<"path", any, {}, never>;
40
+ declare const _default: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & {
41
+ /**
42
+ * Current angle reading of the compass, between 0.0 - 360.0 degrees,
43
+ * inclusive.
44
+ */
45
+ angle?: number | undefined;
46
+ /**
47
+ * Length of the knob along the track expressed in degrees, between 0.0 and
48
+ * 360.0 degrees, exclusive. If set to 0 or 360, the knob disappears.
49
+ *
50
+ * @example Suppose the compass were to be used to control a photosphere of an
51
+ * image that is 1000 x 500, and the window size is 500 x 500, that
52
+ * would mean the FOV is 500 / 1000 * 360 = 180 degrees.
53
+ */
54
+ knobLength?: number | undefined;
55
+ /**
56
+ * Radius of the compass.
57
+ */
58
+ radius?: number | undefined;
59
+ /**
60
+ * The thickness of the knob, which is equivalent to the `stroke-width` of the
61
+ * `<path>` element. Note that this overwrites the `stroke-width` set inside
62
+ * `cssKnob`.
63
+ */
64
+ knobThickness?: number | undefined;
65
+ /**
66
+ * The thickness of the circular track, which is equivalent to the
67
+ * `stroke-width` of the `<circle>` element. Note that this overwrites the
68
+ * `stroke-width` set inside `cssTrack`.
69
+ */
70
+ trackThickness?: number | undefined;
71
+ } & {
72
+ children?: React.ReactNode;
73
+ } & React.RefAttributes<HTMLDivElement>>;
74
+ export default _default;
75
+ export declare const DialTrack: ({ ...props }: SVGAttributes<SVGCircleElement>) => JSX.Element;
76
+ export declare const DialKnob: ({ ...props }: SVGAttributes<SVGPathElement>) => JSX.Element;
package/lib/Dial.js CHANGED
@@ -1,8 +1,4 @@
1
1
  "use strict";
2
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
- return cooked;
5
- };
6
2
  var __assign = (this && this.__assign) || function () {
7
3
  __assign = Object.assign || function(t) {
8
4
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -14,6 +10,29 @@ var __assign = (this && this.__assign) || function () {
14
10
  };
15
11
  return __assign.apply(this, arguments);
16
12
  };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
17
36
  var __rest = (this && this.__rest) || function (s, e) {
18
37
  var t = {};
19
38
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -30,13 +49,96 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
30
49
  };
31
50
  Object.defineProperty(exports, "__esModule", { value: true });
32
51
  exports.DialKnob = exports.DialTrack = void 0;
33
- var react_1 = __importDefault(require("react"));
34
- var styled_components_1 = __importDefault(require("styled-components"));
52
+ var react_1 = __importStar(require("react"));
53
+ var asComponentDict_1 = __importDefault(require("./utils/asComponentDict"));
54
+ var asStyleDict_1 = __importDefault(require("./utils/asStyleDict"));
55
+ var cloneStyledElement_1 = __importDefault(require("./utils/cloneStyledElement"));
56
+ var styles_1 = __importDefault(require("./utils/styles"));
57
+ /**
58
+ * A circular dial with a knob and a track.
59
+ *
60
+ * @exports DialKnob
61
+ * @exports DialTrack
62
+ */
63
+ exports.default = (0, react_1.forwardRef)(function (_a, ref) {
64
+ var _b, _c;
65
+ var _d = _a.angle, angle = _d === void 0 ? 0 : _d, children = _a.children, _e = _a.knobLength, knobLength = _e === void 0 ? 30 : _e, _f = _a.knobThickness, knobThickness = _f === void 0 ? 10 : _f, _g = _a.radius, radius = _g === void 0 ? 50 : _g, _h = _a.trackThickness, trackThickness = _h === void 0 ? 2 : _h, style = _a.style, props = __rest(_a, ["angle", "children", "knobLength", "knobThickness", "radius", "trackThickness", "style"]);
66
+ var diameter = radius * 2;
67
+ var clampedKnobAngle = Math.max(0, Math.min(360, knobLength));
68
+ var components = (0, asComponentDict_1.default)(children, {
69
+ track: exports.DialTrack,
70
+ knob: exports.DialKnob,
71
+ });
72
+ var fixedStyles = (0, asStyleDict_1.default)({
73
+ root: {
74
+ height: "".concat(diameter, "px"),
75
+ width: "".concat(diameter, "px"),
76
+ },
77
+ knobContainer: {
78
+ backgroundPosition: 'center',
79
+ backgroundRepeat: 'no-repeat',
80
+ backgroundSize: '100%',
81
+ height: '100%',
82
+ left: '0',
83
+ position: 'absolute',
84
+ top: '0',
85
+ transformOrigin: 'center',
86
+ width: '100%',
87
+ transform: "rotate(".concat((angle + 360) % 360, "deg)"),
88
+ },
89
+ trackContainer: {
90
+ height: '100%',
91
+ left: '0',
92
+ position: 'absolute',
93
+ top: '0',
94
+ transformOrigin: 'center',
95
+ width: '100%',
96
+ },
97
+ svgContainer: {
98
+ overflow: 'visible',
99
+ position: 'absolute',
100
+ right: '0',
101
+ top: '0',
102
+ },
103
+ });
104
+ var defaultStyles = (0, asStyleDict_1.default)({
105
+ knob: {
106
+ stroke: '#fff',
107
+ },
108
+ track: {
109
+ strokeDasharray: '4',
110
+ stroke: '#fff',
111
+ },
112
+ });
113
+ return (react_1.default.createElement("div", __assign({}, props, { ref: ref, style: (0, styles_1.default)(style, fixedStyles.root) }),
114
+ react_1.default.createElement("div", { style: fixedStyles.trackContainer },
115
+ react_1.default.createElement("svg", { width: diameter, height: diameter, viewBox: "0 0 ".concat(diameter, " ").concat(diameter), style: fixedStyles.svgContainer }, (0, cloneStyledElement_1.default)((_b = components.track) !== null && _b !== void 0 ? _b : react_1.default.createElement(exports.DialTrack, { style: defaultStyles.track }), {
116
+ cx: radius,
117
+ cy: radius,
118
+ r: radius - trackThickness / 2,
119
+ strokeWidth: trackThickness,
120
+ }))),
121
+ react_1.default.createElement("div", { style: (0, styles_1.default)(fixedStyles.knobContainer) },
122
+ react_1.default.createElement("svg", { viewBox: "0 0 ".concat(diameter, " ").concat(diameter), xmlns: 'http://www.w3.org/2000/svg', style: fixedStyles.svgContainer }, (0, cloneStyledElement_1.default)((_c = components.knob) !== null && _c !== void 0 ? _c : react_1.default.createElement(exports.DialKnob, { style: defaultStyles.knob }), {
123
+ strokeWidth: knobThickness,
124
+ d: arcPath(radius, radius, radius - knobThickness / 2 - (trackThickness - knobThickness) / 2, -clampedKnobAngle / 2, clampedKnobAngle / 2),
125
+ })))));
126
+ });
127
+ var DialTrack = function (_a) {
128
+ var props = __rest(_a, []);
129
+ return react_1.default.createElement("circle", __assign({}, props));
130
+ };
131
+ exports.DialTrack = DialTrack;
132
+ var DialKnob = function (_a) {
133
+ var props = __rest(_a, []);
134
+ return react_1.default.createElement("path", __assign({}, props));
135
+ };
136
+ exports.DialKnob = DialKnob;
35
137
  function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
36
138
  var angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0;
37
139
  return {
38
- x: centerX + (radius * Math.cos(angleInRadians)),
39
- y: centerY + (radius * Math.sin(angleInRadians)),
140
+ x: centerX + radius * Math.cos(angleInRadians),
141
+ y: centerY + radius * Math.sin(angleInRadians),
40
142
  };
41
143
  }
42
144
  function arcPath(x, y, radius, startAngle, endAngle) {
@@ -44,34 +146,18 @@ function arcPath(x, y, radius, startAngle, endAngle) {
44
146
  var end = polarToCartesian(x, y, radius, startAngle);
45
147
  var largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1';
46
148
  var d = [
47
- 'M', start.x, start.y,
48
- 'A', radius, radius, 0, largeArcFlag, 0, end.x, end.y,
149
+ 'M',
150
+ start.x,
151
+ start.y,
152
+ 'A',
153
+ radius,
154
+ radius,
155
+ 0,
156
+ largeArcFlag,
157
+ 0,
158
+ end.x,
159
+ end.y,
49
160
  ];
50
161
  return d.join(' ');
51
162
  }
52
- /**
53
- * A circular dial with a knob and a track.
54
- *
55
- * @exports DialKnob
56
- * @exports DialTrack
57
- */
58
- function Dial(_a) {
59
- var _b = _a.angle, angle = _b === void 0 ? 0 : _b, _c = _a.radius, radius = _c === void 0 ? 50 : _c, _d = _a.knobLength, knobLength = _d === void 0 ? 30 : _d, _e = _a.knobThickness, knobThickness = _e === void 0 ? 10 : _e, _f = _a.trackThickness, trackThickness = _f === void 0 ? 2 : _f, style = _a.style, props = __rest(_a, ["angle", "radius", "knobLength", "knobThickness", "trackThickness", "style"]);
60
- var diameter = radius * 2;
61
- var clampedKnobAngle = Math.max(0, Math.min(360, knobLength));
62
- return (react_1.default.createElement(StyledRoot, __assign({ style: __assign(__assign({}, style), { width: "".concat(diameter, "px"), height: "".concat(diameter, "px") }) }, props),
63
- react_1.default.createElement(StyledTrackContainer, null,
64
- react_1.default.createElement("svg", { width: diameter, height: diameter, viewBox: "0 0 ".concat(diameter, " ").concat(diameter) },
65
- react_1.default.createElement(exports.DialTrack, { cx: radius, cy: radius, r: radius - trackThickness / 2, strokeWidth: trackThickness }))),
66
- react_1.default.createElement(StyledKnobContainer, { style: { transform: "rotate(".concat((angle + 360) % 360, "deg)") } },
67
- react_1.default.createElement("svg", { viewBox: "0 0 ".concat(diameter, " ").concat(diameter), xmlns: 'http://www.w3.org/2000/svg' },
68
- react_1.default.createElement(exports.DialKnob, { strokeWidth: knobThickness, d: arcPath(radius, radius, radius - knobThickness / 2 - (trackThickness - knobThickness) / 2, -clampedKnobAngle / 2, clampedKnobAngle / 2) })))));
69
- }
70
- exports.default = Dial;
71
- exports.DialTrack = styled_components_1.default.circle(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n stroke-dasharray: 4;\n stroke: #fff;\n"], ["\n stroke-dasharray: 4;\n stroke: #fff;\n"])));
72
- exports.DialKnob = styled_components_1.default.path(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n stroke: #fff;\n"], ["\n stroke: #fff;\n"])));
73
- var StyledTrackContainer = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n"], ["\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n"])));
74
- var StyledKnobContainer = styled_components_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n background-position: center;\n background-repeat: no-repeat;\n background-size: 100%;\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n\n svg {\n overflow: visible;\n position: absolute;\n right: 0;\n top: 0;\n }\n"], ["\n background-position: center;\n background-repeat: no-repeat;\n background-size: 100%;\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n\n svg {\n overflow: visible;\n position: absolute;\n right: 0;\n top: 0;\n }\n"])));
75
- var StyledRoot = styled_components_1.default.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n box-sizing: border-box;\n display: block;\n"], ["\n box-sizing: border-box;\n display: block;\n"])));
76
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
77
163
  //# sourceMappingURL=Dial.js.map
package/lib/Dial.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Dial.js","sourceRoot":"/","sources":["Dial.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { HTMLAttributes } from 'react'\nimport styled from 'styled-components'\n\nexport type Props = HTMLAttributes<HTMLDivElement> & {\n /**\n * Current angle reading of the compass, between 0.0 - 360.0 degrees, inclusive.\n */\n angle?: number\n\n /**\n * Length of the knob along the track expressed in degrees, between 0.0 and 360.0 degrees,\n * exclusive. If set to 0 or 360, the knob disappears.\n *\n * @example Suppose the compass were to be used to control a photosphere of an image that is 1000\n * x 500, and the window size is 500 x 500, that would mean the FOV is 500 / 1000 * 360 =\n * 180 degrees.\n */\n knobLength?: number\n\n /**\n * Radius of the compass.\n */\n radius?: number\n\n /**\n * The thickness of the knob, which is equivalent to the `stroke-width` of the `<path>` element.\n * Note that this overwrites the `stroke-width` set inside `cssKnob`.\n */\n knobThickness?: number\n\n /**\n * The thickness of the circular track, which is equivalent to the `stroke-width` of the\n * `<circle>` element. Note that this overwrites the `stroke-width` set inside `cssTrack`.\n */\n trackThickness?: number\n}\n\nfunction polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number) {\n const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0\n\n return {\n x: centerX + (radius * Math.cos(angleInRadians)),\n y: centerY + (radius * Math.sin(angleInRadians)),\n }\n}\n\nfunction arcPath(x: number, y: number, radius: number, startAngle: number, endAngle: number) {\n const start = polarToCartesian(x, y, radius, endAngle)\n const end = polarToCartesian(x, y, radius, startAngle)\n const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1'\n const d = [\n 'M', start.x, start.y,\n 'A', radius, radius, 0, largeArcFlag, 0, end.x, end.y,\n ]\n\n return d.join(' ')\n}\n\n/**\n * A circular dial with a knob and a track.\n *\n * @exports DialKnob\n * @exports DialTrack\n */\nexport default function Dial({\n angle = 0,\n radius = 50,\n knobLength = 30,\n knobThickness = 10,\n trackThickness = 2,\n style,\n ...props\n}: Props) {\n const diameter = radius * 2\n const clampedKnobAngle = Math.max(0, Math.min(360, knobLength))\n\n return (\n <StyledRoot style={{ ...style, width: `${diameter}px`, height: `${diameter}px` }} {...props}>\n <StyledTrackContainer>\n <svg width={diameter} height={diameter} viewBox={`0 0 ${diameter} ${diameter}`}>\n <DialTrack\n cx={radius}\n cy={radius}\n r={radius - trackThickness / 2}\n strokeWidth={trackThickness}\n />\n </svg>\n </StyledTrackContainer>\n <StyledKnobContainer style={{ transform: `rotate(${(angle + 360) % 360}deg)` }}>\n <svg viewBox={`0 0 ${diameter} ${diameter}`} xmlns='http://www.w3.org/2000/svg'>\n <DialKnob strokeWidth={knobThickness} d={arcPath(radius, radius, radius - knobThickness / 2 - (trackThickness - knobThickness) / 2, -clampedKnobAngle / 2, clampedKnobAngle / 2)}/>\n </svg>\n </StyledKnobContainer>\n </StyledRoot>\n )\n}\n\nexport const DialTrack = styled.circle`\n stroke-dasharray: 4;\n stroke: #fff;\n`\n\nexport const DialKnob = styled.path`\n stroke: #fff;\n`\n\nconst StyledTrackContainer = styled.div`\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n`\n\nconst StyledKnobContainer = styled.div`\n background-position: center;\n background-repeat: no-repeat;\n background-size: 100%;\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n transform-origin: center;\n width: 100%;\n\n svg {\n overflow: visible;\n position: absolute;\n right: 0;\n top: 0;\n }\n`\n\nconst StyledRoot = styled.div`\n box-sizing: border-box;\n display: block;\n`\n"]}
1
+ {"version":3,"file":"Dial.js","sourceRoot":"/","sources":["Dial.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { forwardRef, HTMLAttributes, PropsWithChildren, SVGAttributes } from 'react'\nimport asComponentDict from './utils/asComponentDict'\nimport asStyleDict from './utils/asStyleDict'\nimport cloneStyledElement from './utils/cloneStyledElement'\nimport styles from './utils/styles'\n\nexport type DialProps = HTMLAttributes<HTMLDivElement> & PropsWithChildren<{\n /**\n * Current angle reading of the compass, between 0.0 - 360.0 degrees,\n * inclusive.\n */\n angle?: number\n\n /**\n * Length of the knob along the track expressed in degrees, between 0.0 and\n * 360.0 degrees, exclusive. If set to 0 or 360, the knob disappears.\n *\n * @example Suppose the compass were to be used to control a photosphere of an\n * image that is 1000 x 500, and the window size is 500 x 500, that\n * would mean the FOV is 500 / 1000 * 360 = 180 degrees.\n */\n knobLength?: number\n\n /**\n * Radius of the compass.\n */\n radius?: number\n\n /**\n * The thickness of the knob, which is equivalent to the `stroke-width` of the\n * `<path>` element. Note that this overwrites the `stroke-width` set inside\n * `cssKnob`.\n */\n knobThickness?: number\n\n /**\n * The thickness of the circular track, which is equivalent to the\n * `stroke-width` of the `<circle>` element. Note that this overwrites the\n * `stroke-width` set inside `cssTrack`.\n */\n trackThickness?: number\n}>\n\n/**\n * A circular dial with a knob and a track.\n *\n * @exports DialKnob\n * @exports DialTrack\n */\nexport default forwardRef<HTMLDivElement, DialProps>(({\n angle = 0,\n children,\n knobLength = 30,\n knobThickness = 10,\n radius = 50,\n trackThickness = 2,\n style,\n ...props\n}, ref) => {\n const diameter = radius * 2\n const clampedKnobAngle = Math.max(0, Math.min(360, knobLength))\n\n const components = asComponentDict(children, {\n track: DialTrack,\n knob: DialKnob,\n })\n\n const fixedStyles = asStyleDict({\n root: {\n height: `${diameter}px`,\n width: `${diameter}px`,\n },\n knobContainer: {\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '100%',\n height: '100%',\n left: '0',\n position: 'absolute',\n top: '0',\n transformOrigin: 'center',\n width: '100%',\n transform: `rotate(${(angle + 360) % 360}deg)`,\n },\n trackContainer: {\n height: '100%',\n left: '0',\n position: 'absolute',\n top: '0',\n transformOrigin: 'center',\n width: '100%',\n },\n svgContainer: {\n overflow: 'visible',\n position: 'absolute',\n right: '0',\n top: '0',\n },\n })\n\n const defaultStyles = asStyleDict({\n knob: {\n stroke: '#fff',\n },\n track: {\n strokeDasharray: '4',\n stroke: '#fff',\n },\n })\n\n return (\n <div {...props} ref={ref} style={styles(style, fixedStyles.root)}>\n <div style={fixedStyles.trackContainer}>\n <svg width={diameter} height={diameter} viewBox={`0 0 ${diameter} ${diameter}`} style={fixedStyles.svgContainer}>\n {cloneStyledElement(components.track ?? <DialTrack style={defaultStyles.track}/>, {\n cx: radius,\n cy: radius,\n r: radius - trackThickness / 2,\n strokeWidth: trackThickness,\n })}\n </svg>\n </div>\n <div style={styles(fixedStyles.knobContainer)}>\n <svg viewBox={`0 0 ${diameter} ${diameter}`} xmlns='http://www.w3.org/2000/svg' style={fixedStyles.svgContainer}>\n {cloneStyledElement(components.knob ?? <DialKnob style={defaultStyles.knob}/>, {\n strokeWidth: knobThickness,\n d: arcPath(radius, radius, radius - knobThickness / 2 - (trackThickness - knobThickness) / 2, -clampedKnobAngle / 2, clampedKnobAngle / 2),\n })}\n </svg>\n </div>\n </div>\n )\n})\n\nexport const DialTrack = ({ ...props }: SVGAttributes<SVGCircleElement>) => <circle {...props}/>\n\nexport const DialKnob = ({ ...props }: SVGAttributes<SVGPathElement>) => <path {...props}/>\n\nfunction polarToCartesian(centerX: number, centerY: number, radius: number, angleInDegrees: number) {\n const angleInRadians = (angleInDegrees - 90) * Math.PI / 180.0\n\n return {\n x: centerX + radius * Math.cos(angleInRadians),\n y: centerY + radius * Math.sin(angleInRadians),\n }\n}\n\nfunction arcPath(x: number, y: number, radius: number, startAngle: number, endAngle: number) {\n const start = polarToCartesian(x, y, radius, endAngle)\n const end = polarToCartesian(x, y, radius, startAngle)\n const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1'\n const d = [\n 'M',\n start.x,\n start.y,\n 'A',\n radius,\n radius,\n 0,\n largeArcFlag,\n 0,\n end.x,\n end.y,\n ]\n\n return d.join(' ')\n}\n"]}