@remember-web/primitive 0.1.16 → 0.1.18

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.
@@ -1,10 +1,18 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ var _taggedTemplateLiteral = require('@babel/runtime/helpers/taggedTemplateLiteral');
4
5
  var icon = require('@remember-web/icon');
5
6
  var util = require('@remember-web/icon/util');
7
+ var styled = require('styled-components');
6
8
  var jsxRuntime = require('react/jsx-runtime');
7
9
 
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var _taggedTemplateLiteral__default = /*#__PURE__*/_interopDefault(_taggedTemplateLiteral);
13
+ var styled__default = /*#__PURE__*/_interopDefault(styled);
14
+
15
+ var _templateObject;
8
16
  var ICON_NAME = {
9
17
  check: {
10
18
  on: icon.ControlCheckOn,
@@ -39,11 +47,14 @@ function ToggleIcon(_ref) {
39
47
  className = _ref.className;
40
48
  var iconSize = typeof size === 'string' && util.isSvgRegularSize(size) ? util.SVG_SIZES[size] : size;
41
49
  var Icon = ICON_NAME[variant][status];
42
- return /*#__PURE__*/jsxRuntime.jsx(Icon, {
43
- className: className,
44
- size: iconSize
50
+ return /*#__PURE__*/jsxRuntime.jsx(ToggleIconContainer, {
51
+ className: "toggleIcon ".concat(className),
52
+ children: /*#__PURE__*/jsxRuntime.jsx(Icon, {
53
+ size: iconSize
54
+ })
45
55
  });
46
56
  }
57
+ var ToggleIconContainer = styled__default.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral__default.default(["\n border-radius: 50%;\n\n > svg {\n display: block;\n }\n"])));
47
58
 
48
59
  exports.ToggleIcon = ToggleIcon;
49
60
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n ControlBookmarkOff,\n ControlBookmarkOn,\n ControlCheckOff,\n ControlCheckOn,\n ControlCheckboxIndeterminate,\n ControlCheckboxOff,\n ControlCheckboxOn,\n ControlFavoriteOff,\n ControlFavoriteOn,\n ControlRadioOff,\n ControlRadioOn,\n} from '@remember-web/icon';\nimport {\n SVG_SIZES,\n isSvgRegularSize,\n type SvgSizeProps,\n type WithSvgSizeComponentType,\n} from '@remember-web/icon/util';\n\nimport type { ToggleStatusType, ToggleVariantType } from '../types';\n\nconst ICON_NAME = {\n check: {\n on: ControlCheckOn,\n indeterminate: ControlCheckOn,\n off: ControlCheckOff,\n },\n checkbox: {\n on: ControlCheckboxOn,\n indeterminate: ControlCheckboxIndeterminate,\n off: ControlCheckboxOff,\n },\n favorite: {\n on: ControlFavoriteOn,\n indeterminate: ControlFavoriteOn,\n off: ControlFavoriteOff,\n },\n bookmark: {\n on: ControlBookmarkOn,\n indeterminate: ControlBookmarkOn,\n off: ControlBookmarkOff,\n },\n radio: {\n on: ControlRadioOn,\n indeterminate: ControlRadioOff,\n off: ControlRadioOff,\n },\n} as const satisfies Record<\n ToggleVariantType,\n Record<ToggleStatusType, WithSvgSizeComponentType>\n>;\n\nexport function ToggleIcon({\n size,\n status,\n variant,\n className,\n}: {\n variant: ToggleVariantType;\n status: ToggleStatusType;\n className?: string;\n} & SvgSizeProps) {\n const iconSize =\n typeof size === 'string' && isSvgRegularSize(size) ? SVG_SIZES[size] : size;\n\n const Icon = ICON_NAME[variant][status];\n\n return <Icon className={className} size={iconSize} />;\n}\n"],"names":["check","on","indeterminate","off","checkbox","favorite","bookmark","radio","className","size"],"mappings":";;;;;;;AAwBA;AACEA;AACEC;AACAC;AACAC;;AAEFC;AACEH;AACAC;AACAC;;AAEFE;AACEJ;AACAC;AACAC;;AAEFG;AACEL;AACAC;AACAC;;AAEFI;AACEN;AACAC;AACAC;AACF;AACF;AAKO;AASW;;;;AAChB;;;AAKaK;AAAsBC;AAAe;AACpD;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n ControlBookmarkOff,\n ControlBookmarkOn,\n ControlCheckOff,\n ControlCheckOn,\n ControlCheckboxIndeterminate,\n ControlCheckboxOff,\n ControlCheckboxOn,\n ControlFavoriteOff,\n ControlFavoriteOn,\n ControlRadioOff,\n ControlRadioOn,\n} from '@remember-web/icon';\nimport {\n SVG_SIZES,\n isSvgRegularSize,\n type SvgSizeProps,\n type WithSvgSizeComponentType,\n} from '@remember-web/icon/util';\nimport styled from 'styled-components';\n\nimport type { ToggleStatusType, ToggleVariantType } from '../types';\n\nconst ICON_NAME = {\n check: {\n on: ControlCheckOn,\n indeterminate: ControlCheckOn,\n off: ControlCheckOff,\n },\n checkbox: {\n on: ControlCheckboxOn,\n indeterminate: ControlCheckboxIndeterminate,\n off: ControlCheckboxOff,\n },\n favorite: {\n on: ControlFavoriteOn,\n indeterminate: ControlFavoriteOn,\n off: ControlFavoriteOff,\n },\n bookmark: {\n on: ControlBookmarkOn,\n indeterminate: ControlBookmarkOn,\n off: ControlBookmarkOff,\n },\n radio: {\n on: ControlRadioOn,\n indeterminate: ControlRadioOff,\n off: ControlRadioOff,\n },\n} as const satisfies Record<\n ToggleVariantType,\n Record<ToggleStatusType, WithSvgSizeComponentType>\n>;\n\nexport function ToggleIcon({\n size,\n status,\n variant,\n className,\n}: {\n variant: ToggleVariantType;\n status: ToggleStatusType;\n className?: string;\n} & SvgSizeProps) {\n const iconSize =\n typeof size === 'string' && isSvgRegularSize(size) ? SVG_SIZES[size] : size;\n\n const Icon = ICON_NAME[variant][status];\n\n return (\n <ToggleIconContainer className={`toggleIcon ${className}`}>\n <Icon size={iconSize} />\n </ToggleIconContainer>\n );\n}\n\nconst ToggleIconContainer = styled.div`\n border-radius: 50%;\n\n > svg {\n display: block;\n }\n`;\n"],"names":["check","on","indeterminate","off","checkbox","favorite","bookmark","radio","className","size"],"mappings":";;;;;;;;;;;;;;AAAa;AAyBb;AACEA;AACEC;AACAC;AACAC;;AAEFC;AACEH;AACAC;AACAC;;AAEFE;AACEJ;AACAC;AACAC;;AAEFG;AACEL;AACAC;AACAC;;AAEFI;AACEN;AACAC;AACAC;AACF;AACF;AAKO;AASW;;;;AAChB;;;AAMuBK;;AACbC;;AAAkB;AAG9B;AAEA;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAiCpE,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,YAAY,2CAOf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"names":[],"mappings":"AAeA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAiCpE,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,YAAY,2CAWf"}
@@ -1,8 +1,11 @@
1
1
  "use client";
2
+ import _taggedTemplateLiteral from '@babel/runtime/helpers/taggedTemplateLiteral';
2
3
  import { ControlCheckOn, ControlCheckOff, ControlCheckboxOn, ControlCheckboxIndeterminate, ControlCheckboxOff, ControlFavoriteOn, ControlFavoriteOff, ControlBookmarkOn, ControlBookmarkOff, ControlRadioOn, ControlRadioOff } from '@remember-web/icon';
3
4
  import { isSvgRegularSize, SVG_SIZES } from '@remember-web/icon/util';
5
+ import styled from 'styled-components';
4
6
  import { jsx } from 'react/jsx-runtime';
5
7
 
8
+ var _templateObject;
6
9
  var ICON_NAME = {
7
10
  check: {
8
11
  on: ControlCheckOn,
@@ -37,11 +40,14 @@ function ToggleIcon(_ref) {
37
40
  className = _ref.className;
38
41
  var iconSize = typeof size === 'string' && isSvgRegularSize(size) ? SVG_SIZES[size] : size;
39
42
  var Icon = ICON_NAME[variant][status];
40
- return /*#__PURE__*/jsx(Icon, {
41
- className: className,
42
- size: iconSize
43
+ return /*#__PURE__*/jsx(ToggleIconContainer, {
44
+ className: "toggleIcon ".concat(className),
45
+ children: /*#__PURE__*/jsx(Icon, {
46
+ size: iconSize
47
+ })
43
48
  });
44
49
  }
50
+ var ToggleIconContainer = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n border-radius: 50%;\n\n > svg {\n display: block;\n }\n"])));
45
51
 
46
52
  export { ToggleIcon };
47
53
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n ControlBookmarkOff,\n ControlBookmarkOn,\n ControlCheckOff,\n ControlCheckOn,\n ControlCheckboxIndeterminate,\n ControlCheckboxOff,\n ControlCheckboxOn,\n ControlFavoriteOff,\n ControlFavoriteOn,\n ControlRadioOff,\n ControlRadioOn,\n} from '@remember-web/icon';\nimport {\n SVG_SIZES,\n isSvgRegularSize,\n type SvgSizeProps,\n type WithSvgSizeComponentType,\n} from '@remember-web/icon/util';\n\nimport type { ToggleStatusType, ToggleVariantType } from '../types';\n\nconst ICON_NAME = {\n check: {\n on: ControlCheckOn,\n indeterminate: ControlCheckOn,\n off: ControlCheckOff,\n },\n checkbox: {\n on: ControlCheckboxOn,\n indeterminate: ControlCheckboxIndeterminate,\n off: ControlCheckboxOff,\n },\n favorite: {\n on: ControlFavoriteOn,\n indeterminate: ControlFavoriteOn,\n off: ControlFavoriteOff,\n },\n bookmark: {\n on: ControlBookmarkOn,\n indeterminate: ControlBookmarkOn,\n off: ControlBookmarkOff,\n },\n radio: {\n on: ControlRadioOn,\n indeterminate: ControlRadioOff,\n off: ControlRadioOff,\n },\n} as const satisfies Record<\n ToggleVariantType,\n Record<ToggleStatusType, WithSvgSizeComponentType>\n>;\n\nexport function ToggleIcon({\n size,\n status,\n variant,\n className,\n}: {\n variant: ToggleVariantType;\n status: ToggleStatusType;\n className?: string;\n} & SvgSizeProps) {\n const iconSize =\n typeof size === 'string' && isSvgRegularSize(size) ? SVG_SIZES[size] : size;\n\n const Icon = ICON_NAME[variant][status];\n\n return <Icon className={className} size={iconSize} />;\n}\n"],"names":["check","on","indeterminate","off","checkbox","favorite","bookmark","radio","className","size"],"mappings":";;;;;AAwBA;AACEA;AACEC;AACAC;AACAC;;AAEFC;AACEH;AACAC;AACAC;;AAEFE;AACEJ;AACAC;AACAC;;AAEFG;AACEL;AACAC;AACAC;;AAEFI;AACEN;AACAC;AACAC;AACF;AACF;AAKO;AASW;;;;AAChB;;;AAKaK;AAAsBC;AAAe;AACpD;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../../../src/Control/BaseToggle/ToggleIcon/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n ControlBookmarkOff,\n ControlBookmarkOn,\n ControlCheckOff,\n ControlCheckOn,\n ControlCheckboxIndeterminate,\n ControlCheckboxOff,\n ControlCheckboxOn,\n ControlFavoriteOff,\n ControlFavoriteOn,\n ControlRadioOff,\n ControlRadioOn,\n} from '@remember-web/icon';\nimport {\n SVG_SIZES,\n isSvgRegularSize,\n type SvgSizeProps,\n type WithSvgSizeComponentType,\n} from '@remember-web/icon/util';\nimport styled from 'styled-components';\n\nimport type { ToggleStatusType, ToggleVariantType } from '../types';\n\nconst ICON_NAME = {\n check: {\n on: ControlCheckOn,\n indeterminate: ControlCheckOn,\n off: ControlCheckOff,\n },\n checkbox: {\n on: ControlCheckboxOn,\n indeterminate: ControlCheckboxIndeterminate,\n off: ControlCheckboxOff,\n },\n favorite: {\n on: ControlFavoriteOn,\n indeterminate: ControlFavoriteOn,\n off: ControlFavoriteOff,\n },\n bookmark: {\n on: ControlBookmarkOn,\n indeterminate: ControlBookmarkOn,\n off: ControlBookmarkOff,\n },\n radio: {\n on: ControlRadioOn,\n indeterminate: ControlRadioOff,\n off: ControlRadioOff,\n },\n} as const satisfies Record<\n ToggleVariantType,\n Record<ToggleStatusType, WithSvgSizeComponentType>\n>;\n\nexport function ToggleIcon({\n size,\n status,\n variant,\n className,\n}: {\n variant: ToggleVariantType;\n status: ToggleStatusType;\n className?: string;\n} & SvgSizeProps) {\n const iconSize =\n typeof size === 'string' && isSvgRegularSize(size) ? SVG_SIZES[size] : size;\n\n const Icon = ICON_NAME[variant][status];\n\n return (\n <ToggleIconContainer className={`toggleIcon ${className}`}>\n <Icon size={iconSize} />\n </ToggleIconContainer>\n );\n}\n\nconst ToggleIconContainer = styled.div`\n border-radius: 50%;\n\n > svg {\n display: block;\n }\n`;\n"],"names":["check","on","indeterminate","off","checkbox","favorite","bookmark","radio","className","size"],"mappings":";;;;;;;AAAa;AAyBb;AACEA;AACEC;AACAC;AACAC;;AAEFC;AACEH;AACAC;AACAC;;AAEFE;AACEJ;AACAC;AACAC;;AAEFG;AACEL;AACAC;AACAC;;AAEFI;AACEN;AACAC;AACAC;AACF;AACF;AAKO;AASW;;;;AAChB;;;AAMuBK;;AACbC;;AAAkB;AAG9B;AAEA;;"}
@@ -23,7 +23,7 @@ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefault(_objectWith
23
23
  var _excluded = ["variant", "label", "labelPosition", "className", "inputClassName", "size", "labelGap", "type", "onToggle", "onChange", "indeterminate"];
24
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default.default(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
26
- var _BaseToggle = function _BaseToggle(_ref, _ref2) {
26
+ var _BaseToggle = function _BaseToggle(_ref, ref) {
27
27
  var variant = _ref.variant,
28
28
  _label = _ref.label,
29
29
  _ref$labelPosition = _ref.labelPosition,
@@ -45,22 +45,23 @@ var _BaseToggle = function _BaseToggle(_ref, _ref2) {
45
45
  variant: "Body1",
46
46
  children: _label
47
47
  }) : _label;
48
+ var refCallback = react.useCallback(function (input) {
49
+ if (ref) {
50
+ if (typeof ref === 'function') {
51
+ ref(input);
52
+ } else {
53
+ ref.current = input;
54
+ }
55
+ }
56
+ if (input) {
57
+ input.indeterminate = indeterminate !== null && indeterminate !== void 0 ? indeterminate : false;
58
+ }
59
+ }, [indeterminate, ref]);
48
60
  return /*#__PURE__*/jsxRuntime.jsxs(styles.ToggleRoot, {
49
61
  className: className,
50
62
  $gap: labelGap,
51
63
  children: [/*#__PURE__*/jsxRuntime.jsx(styles.ToggleInput, _objectSpread(_objectSpread({
52
- ref: function ref(input) {
53
- if (_ref2) {
54
- if (typeof _ref2 === 'function') {
55
- _ref2(input);
56
- } else {
57
- _ref2.current = input;
58
- }
59
- }
60
- if (input) {
61
- input.indeterminate = indeterminate !== null && indeterminate !== void 0 ? indeterminate : false;
62
- }
63
- },
64
+ ref: refCallback,
64
65
  className: inputClassName,
65
66
  type: type
66
67
  }, props), {}, {
@@ -73,7 +74,7 @@ var _BaseToggle = function _BaseToggle(_ref, _ref2) {
73
74
  size: size,
74
75
  status: "on",
75
76
  variant: variant
76
- }), /*#__PURE__*/jsxRuntime.jsx(index.ToggleIcon, {
77
+ }), type === 'checkbox' && /*#__PURE__*/jsxRuntime.jsx(index.ToggleIcon, {
77
78
  className: "indeterminateIcon",
78
79
  size: size,
79
80
  status: "indeterminate",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../../src/Control/BaseToggle/index.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardRefRenderFunction } from 'react';\nimport { forwardRef } from 'react';\n\nimport { Typography } from '@/Common';\n\nimport { ToggleIcon } from './ToggleIcon';\nimport { ToggleInput, ToggleRoot } from './styles';\nimport type { BaseToggleProps } from './types';\n\nconst _BaseToggle: ForwardRefRenderFunction<\n HTMLInputElement,\n BaseToggleProps\n> = (\n {\n variant,\n label: _label,\n labelPosition = 'right',\n className,\n inputClassName,\n size = 'medium',\n labelGap = size === 'small' ? 2 : 4,\n type = 'checkbox',\n onToggle,\n onChange,\n indeterminate,\n ...props\n },\n ref\n) => {\n const isStringLabel = typeof _label === 'string';\n const label = isStringLabel ? (\n <Typography variant=\"Body1\">{_label}</Typography>\n ) : (\n _label\n );\n\n return (\n <ToggleRoot className={className} $gap={labelGap}>\n <ToggleInput\n ref={(input) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(input);\n } else {\n ref.current = input;\n }\n }\n\n if (input) {\n input.indeterminate = indeterminate ?? false;\n }\n }}\n className={inputClassName}\n type={type}\n {...props}\n onChange={(e) => {\n onChange?.(e);\n onToggle?.(e.target.checked);\n }}\n />\n {labelPosition === 'left' && label}\n <ToggleIcon\n className=\"onIcon\"\n size={size}\n status=\"on\"\n variant={variant}\n />\n <ToggleIcon\n className=\"indeterminateIcon\"\n size={size}\n status=\"indeterminate\"\n variant={variant}\n />\n <ToggleIcon\n className=\"offIcon\"\n size={size}\n status=\"off\"\n variant={variant}\n />\n {labelPosition === 'right' && label}\n </ToggleRoot>\n );\n};\n\nexport const BaseToggle = forwardRef(_BaseToggle);\n"],"names":["labelPosition","size","type","props","variant","children","className","$gap","ref","onChange","status"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAa;AAAA;AAAA;AAWb;AAmBK;;;AAZDA;;;;AAGAC;;;;AAEAC;;;;AAIGC;AAIL;AACA;AACcC;AAAeC;;;AAMfC;AAAsBC;AAAeF;AAE7CG;AACE;AACE;;AAEA;;AAEA;AACF;AAEA;;AAEA;;AAEFF;AACAJ;AAAW;AAEXO;AACEA;;AAEF;;AAIAH;AACAL;AACAS;AACAN;AAAiB;AAGjBE;AACAL;AACAS;AACAN;AAAiB;AAGjBE;AACAL;AACAS;AACAN;AAAiB;AAEgB;AAGzC;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../../src/Control/BaseToggle/index.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardRefRenderFunction } from 'react';\nimport { forwardRef, useCallback } from 'react';\n\nimport { Typography } from '@/Common';\n\nimport { ToggleIcon } from './ToggleIcon';\nimport { ToggleInput, ToggleRoot } from './styles';\nimport type { BaseToggleProps } from './types';\n\nconst _BaseToggle: ForwardRefRenderFunction<\n HTMLInputElement,\n BaseToggleProps\n> = (\n {\n variant,\n label: _label,\n labelPosition = 'right',\n className,\n inputClassName,\n size = 'medium',\n labelGap = size === 'small' ? 2 : 4,\n type = 'checkbox',\n onToggle,\n onChange,\n indeterminate,\n ...props\n },\n ref\n) => {\n const isStringLabel = typeof _label === 'string';\n const label = isStringLabel ? (\n <Typography variant=\"Body1\">{_label}</Typography>\n ) : (\n _label\n );\n\n const refCallback = useCallback(\n (input: HTMLInputElement | null) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(input);\n } else {\n ref.current = input;\n }\n }\n\n if (input) {\n input.indeterminate = indeterminate ?? false;\n }\n },\n [indeterminate, ref]\n );\n\n return (\n <ToggleRoot className={className} $gap={labelGap}>\n <ToggleInput\n ref={refCallback}\n className={inputClassName}\n type={type}\n {...props}\n onChange={(e) => {\n onChange?.(e);\n onToggle?.(e.target.checked);\n }}\n />\n {labelPosition === 'left' && label}\n <ToggleIcon\n className=\"onIcon\"\n size={size}\n status=\"on\"\n variant={variant}\n />\n {type === 'checkbox' && (\n <ToggleIcon\n className=\"indeterminateIcon\"\n size={size}\n status=\"indeterminate\"\n variant={variant}\n />\n )}\n <ToggleIcon\n className=\"offIcon\"\n size={size}\n status=\"off\"\n variant={variant}\n />\n {labelPosition === 'right' && label}\n </ToggleRoot>\n );\n};\n\nexport const BaseToggle = forwardRef(_BaseToggle);\n"],"names":["labelPosition","size","type","props","variant","children","className","$gap","ref","onChange","status"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAa;AAAA;AAAA;AAWb;AAmBK;;;AAZDA;;;;AAGAC;;;;AAEAC;;;;AAIGC;AAIL;AACA;AACcC;AAAeC;;AAK7B;AAEI;AACE;;AAEA;;AAEA;AACF;AAEA;;AAEA;AACF;;AAKYC;AAAsBC;AAAeF;AAE7CG;AACAF;AACAJ;AAAW;AAEXO;AACEA;;AAEF;;AAIAH;AACAL;AACAS;AACAN;;AAIEE;AACAL;AACAS;AACAN;AAAiB;AAInBE;AACAL;AACAS;AACAN;AAAiB;AAEgB;AAGzC;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Control/BaseToggle/index.tsx"],"names":[],"mappings":";AAsFA,eAAO,MAAM,UAAU;;;;;;;;;;sJAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Control/BaseToggle/index.tsx"],"names":[],"mappings":";AA6FA,eAAO,MAAM,UAAU;;;;;;;;;;sJAA0B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
3
3
  import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
4
- import { forwardRef } from 'react';
4
+ import { forwardRef, useCallback } from 'react';
5
5
  import '../../Common/Divider/index.esm.js';
6
6
  import '../../Common/Flex/index.esm.js';
7
7
  import '../../Common/Grid/index.esm.js';
@@ -16,7 +16,7 @@ import { ToggleRoot, ToggleInput } from './styles.esm.js';
16
16
  var _excluded = ["variant", "label", "labelPosition", "className", "inputClassName", "size", "labelGap", "type", "onToggle", "onChange", "indeterminate"];
17
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
19
- var _BaseToggle = function _BaseToggle(_ref, _ref2) {
19
+ var _BaseToggle = function _BaseToggle(_ref, ref) {
20
20
  var variant = _ref.variant,
21
21
  _label = _ref.label,
22
22
  _ref$labelPosition = _ref.labelPosition,
@@ -38,22 +38,23 @@ var _BaseToggle = function _BaseToggle(_ref, _ref2) {
38
38
  variant: "Body1",
39
39
  children: _label
40
40
  }) : _label;
41
+ var refCallback = useCallback(function (input) {
42
+ if (ref) {
43
+ if (typeof ref === 'function') {
44
+ ref(input);
45
+ } else {
46
+ ref.current = input;
47
+ }
48
+ }
49
+ if (input) {
50
+ input.indeterminate = indeterminate !== null && indeterminate !== void 0 ? indeterminate : false;
51
+ }
52
+ }, [indeterminate, ref]);
41
53
  return /*#__PURE__*/jsxs(ToggleRoot, {
42
54
  className: className,
43
55
  $gap: labelGap,
44
56
  children: [/*#__PURE__*/jsx(ToggleInput, _objectSpread(_objectSpread({
45
- ref: function ref(input) {
46
- if (_ref2) {
47
- if (typeof _ref2 === 'function') {
48
- _ref2(input);
49
- } else {
50
- _ref2.current = input;
51
- }
52
- }
53
- if (input) {
54
- input.indeterminate = indeterminate !== null && indeterminate !== void 0 ? indeterminate : false;
55
- }
56
- },
57
+ ref: refCallback,
57
58
  className: inputClassName,
58
59
  type: type
59
60
  }, props), {}, {
@@ -66,7 +67,7 @@ var _BaseToggle = function _BaseToggle(_ref, _ref2) {
66
67
  size: size,
67
68
  status: "on",
68
69
  variant: variant
69
- }), /*#__PURE__*/jsx(ToggleIcon, {
70
+ }), type === 'checkbox' && /*#__PURE__*/jsx(ToggleIcon, {
70
71
  className: "indeterminateIcon",
71
72
  size: size,
72
73
  status: "indeterminate",
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../../src/Control/BaseToggle/index.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardRefRenderFunction } from 'react';\nimport { forwardRef } from 'react';\n\nimport { Typography } from '@/Common';\n\nimport { ToggleIcon } from './ToggleIcon';\nimport { ToggleInput, ToggleRoot } from './styles';\nimport type { BaseToggleProps } from './types';\n\nconst _BaseToggle: ForwardRefRenderFunction<\n HTMLInputElement,\n BaseToggleProps\n> = (\n {\n variant,\n label: _label,\n labelPosition = 'right',\n className,\n inputClassName,\n size = 'medium',\n labelGap = size === 'small' ? 2 : 4,\n type = 'checkbox',\n onToggle,\n onChange,\n indeterminate,\n ...props\n },\n ref\n) => {\n const isStringLabel = typeof _label === 'string';\n const label = isStringLabel ? (\n <Typography variant=\"Body1\">{_label}</Typography>\n ) : (\n _label\n );\n\n return (\n <ToggleRoot className={className} $gap={labelGap}>\n <ToggleInput\n ref={(input) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(input);\n } else {\n ref.current = input;\n }\n }\n\n if (input) {\n input.indeterminate = indeterminate ?? false;\n }\n }}\n className={inputClassName}\n type={type}\n {...props}\n onChange={(e) => {\n onChange?.(e);\n onToggle?.(e.target.checked);\n }}\n />\n {labelPosition === 'left' && label}\n <ToggleIcon\n className=\"onIcon\"\n size={size}\n status=\"on\"\n variant={variant}\n />\n <ToggleIcon\n className=\"indeterminateIcon\"\n size={size}\n status=\"indeterminate\"\n variant={variant}\n />\n <ToggleIcon\n className=\"offIcon\"\n size={size}\n status=\"off\"\n variant={variant}\n />\n {labelPosition === 'right' && label}\n </ToggleRoot>\n );\n};\n\nexport const BaseToggle = forwardRef(_BaseToggle);\n"],"names":["labelPosition","size","type","props","variant","children","className","$gap","ref","onChange","status"],"mappings":";;;;;;;;;;;;;;;AAAa;AAAA;AAAA;AAWb;AAmBK;;;AAZDA;;;;AAGAC;;;;AAEAC;;;;AAIGC;AAIL;AACA;AACcC;AAAeC;;;AAMfC;AAAsBC;AAAeF;AAE7CG;AACE;AACE;;AAEA;;AAEA;AACF;AAEA;;AAEA;;AAEFF;AACAJ;AAAW;AAEXO;AACEA;;AAEF;;AAIAH;AACAL;AACAS;AACAN;AAAiB;AAGjBE;AACAL;AACAS;AACAN;AAAiB;AAGjBE;AACAL;AACAS;AACAN;AAAiB;AAEgB;AAGzC;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../../src/Control/BaseToggle/index.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardRefRenderFunction } from 'react';\nimport { forwardRef, useCallback } from 'react';\n\nimport { Typography } from '@/Common';\n\nimport { ToggleIcon } from './ToggleIcon';\nimport { ToggleInput, ToggleRoot } from './styles';\nimport type { BaseToggleProps } from './types';\n\nconst _BaseToggle: ForwardRefRenderFunction<\n HTMLInputElement,\n BaseToggleProps\n> = (\n {\n variant,\n label: _label,\n labelPosition = 'right',\n className,\n inputClassName,\n size = 'medium',\n labelGap = size === 'small' ? 2 : 4,\n type = 'checkbox',\n onToggle,\n onChange,\n indeterminate,\n ...props\n },\n ref\n) => {\n const isStringLabel = typeof _label === 'string';\n const label = isStringLabel ? (\n <Typography variant=\"Body1\">{_label}</Typography>\n ) : (\n _label\n );\n\n const refCallback = useCallback(\n (input: HTMLInputElement | null) => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(input);\n } else {\n ref.current = input;\n }\n }\n\n if (input) {\n input.indeterminate = indeterminate ?? false;\n }\n },\n [indeterminate, ref]\n );\n\n return (\n <ToggleRoot className={className} $gap={labelGap}>\n <ToggleInput\n ref={refCallback}\n className={inputClassName}\n type={type}\n {...props}\n onChange={(e) => {\n onChange?.(e);\n onToggle?.(e.target.checked);\n }}\n />\n {labelPosition === 'left' && label}\n <ToggleIcon\n className=\"onIcon\"\n size={size}\n status=\"on\"\n variant={variant}\n />\n {type === 'checkbox' && (\n <ToggleIcon\n className=\"indeterminateIcon\"\n size={size}\n status=\"indeterminate\"\n variant={variant}\n />\n )}\n <ToggleIcon\n className=\"offIcon\"\n size={size}\n status=\"off\"\n variant={variant}\n />\n {labelPosition === 'right' && label}\n </ToggleRoot>\n );\n};\n\nexport const BaseToggle = forwardRef(_BaseToggle);\n"],"names":["labelPosition","size","type","props","variant","children","className","$gap","ref","onChange","status"],"mappings":";;;;;;;;;;;;;;;AAAa;AAAA;AAAA;AAWb;AAmBK;;;AAZDA;;;;AAGAC;;;;AAEAC;;;;AAIGC;AAIL;AACA;AACcC;AAAeC;;AAK7B;AAEI;AACE;;AAEA;;AAEA;AACF;AAEA;;AAEA;AACF;;AAKYC;AAAsBC;AAAeF;AAE7CG;AACAF;AACAJ;AAAW;AAEXO;AACEA;;AAEF;;AAIAH;AACAL;AACAS;AACAN;;AAIEE;AACAL;AACAS;AACAN;AAAiB;AAInBE;AACAL;AACAS;AACAN;AAAiB;AAEgB;AAGzC;;;"}
@@ -11,11 +11,11 @@ var _taggedTemplateLiteral__default = /*#__PURE__*/_interopDefault(_taggedTempla
11
11
  var styled__default = /*#__PURE__*/_interopDefault(styled);
12
12
 
13
13
  var _templateObject, _templateObject2;
14
- var ToggleRoot = styled__default.default.label(_templateObject || (_templateObject = _taggedTemplateLiteral__default.default(["\n width: fit-content;\n height: fit-content;\n display: flex;\n ", "\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > svg {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n :has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > svg {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n"])), function (_ref) {
14
+ var ToggleRoot = styled__default.default.label(_templateObject || (_templateObject = _taggedTemplateLiteral__default.default(["\n width: fit-content;\n height: fit-content;\n display: flex;\n ", "\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > .toggleIcon {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n &:has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > .toggleIcon {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n"])), function (_ref) {
15
15
  var $gap = _ref.$gap;
16
16
  return $gap && "gap: ".concat($gap, "px;");
17
17
  });
18
- var ToggleInput = styled__default.default.input(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default.default(["\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ svg.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ svg.onIcon {\n display: none;\n }\n\n &:indeterminate ~ svg.offIcon,\n &:indeterminate ~ svg.onIcon {\n display: none;\n }\n\n &:not(:indeterminate) ~ svg.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ svg {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ svg {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ svg {\n outline: solid 2px ", ";\n outline-offset: -1px;\n }\n"])), mixin.primary100);
18
+ var ToggleInput = styled__default.default.input(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral__default.default(["\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ .toggleIcon.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:indeterminate ~ .toggleIcon.offIcon,\n &[type='checkbox']:indeterminate ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:not(:indeterminate) ~ .toggleIcon.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ .toggleIcon {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ .toggleIcon {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ .toggleIcon {\n outline: solid 2px ", ";\n outline-offset: -1px;\n }\n"])), mixin.primary100);
19
19
 
20
20
  exports.ToggleInput = ToggleInput;
21
21
  exports.ToggleRoot = ToggleRoot;
@@ -1 +1 @@
1
- {"version":3,"file":"styles.cjs.js","sources":["../../../../src/Control/BaseToggle/styles.ts"],"sourcesContent":["'use client';\n\nimport styled from 'styled-components';\nimport { primary100 } from '@remember-web/mixin';\n\nexport const ToggleRoot = styled.label<{ $gap?: number }>`\n width: fit-content;\n height: fit-content;\n display: flex;\n ${({ $gap }) => $gap && `gap: ${$gap}px;`}\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > svg {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n :has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > svg {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n`;\n\nexport const ToggleInput = styled.input`\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ svg.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ svg.onIcon {\n display: none;\n }\n\n &:indeterminate ~ svg.offIcon,\n &:indeterminate ~ svg.onIcon {\n display: none;\n }\n\n &:not(:indeterminate) ~ svg.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ svg {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ svg {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ svg {\n outline: solid 2px ${primary100};\n outline-offset: -1px;\n }\n`;\n"],"names":["ToggleRoot","ToggleInput"],"mappings":";;;;;;;;;;;;AAAa;AAKAA;AAIT;AAAO;AAAgC;AAsB9BC;;;"}
1
+ {"version":3,"file":"styles.cjs.js","sources":["../../../../src/Control/BaseToggle/styles.ts"],"sourcesContent":["'use client';\n\nimport styled from 'styled-components';\nimport { primary100 } from '@remember-web/mixin';\n\nexport const ToggleRoot = styled.label<{ $gap?: number }>`\n width: fit-content;\n height: fit-content;\n display: flex;\n ${({ $gap }) => $gap && `gap: ${$gap}px;`}\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > .toggleIcon {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n &:has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > .toggleIcon {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n`;\n\nexport const ToggleInput = styled.input`\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ .toggleIcon.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:indeterminate ~ .toggleIcon.offIcon,\n &[type='checkbox']:indeterminate ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:not(:indeterminate) ~ .toggleIcon.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ .toggleIcon {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ .toggleIcon {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ .toggleIcon {\n outline: solid 2px ${primary100};\n outline-offset: -1px;\n }\n`;\n"],"names":["ToggleRoot","ToggleInput"],"mappings":";;;;;;;;;;;;AAAa;AAKAA;AAIT;AAAO;AAAgC;AAsB9BC;;;"}
@@ -4,11 +4,11 @@ import styled from 'styled-components';
4
4
  import { primary100 } from '@remember-web/mixin';
5
5
 
6
6
  var _templateObject, _templateObject2;
7
- var ToggleRoot = styled.label(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: fit-content;\n height: fit-content;\n display: flex;\n ", "\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > svg {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n :has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > svg {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n"])), function (_ref) {
7
+ var ToggleRoot = styled.label(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n width: fit-content;\n height: fit-content;\n display: flex;\n ", "\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > .toggleIcon {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n &:has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > .toggleIcon {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n"])), function (_ref) {
8
8
  var $gap = _ref.$gap;
9
9
  return $gap && "gap: ".concat($gap, "px;");
10
10
  });
11
- var ToggleInput = styled.input(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ svg.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ svg.onIcon {\n display: none;\n }\n\n &:indeterminate ~ svg.offIcon,\n &:indeterminate ~ svg.onIcon {\n display: none;\n }\n\n &:not(:indeterminate) ~ svg.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ svg {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ svg {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ svg {\n outline: solid 2px ", ";\n outline-offset: -1px;\n }\n"])), primary100);
11
+ var ToggleInput = styled.input(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ .toggleIcon.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:indeterminate ~ .toggleIcon.offIcon,\n &[type='checkbox']:indeterminate ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:not(:indeterminate) ~ .toggleIcon.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ .toggleIcon {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ .toggleIcon {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ .toggleIcon {\n outline: solid 2px ", ";\n outline-offset: -1px;\n }\n"])), primary100);
12
12
 
13
13
  export { ToggleInput, ToggleRoot };
14
14
  //# sourceMappingURL=styles.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.esm.js","sources":["../../../../src/Control/BaseToggle/styles.ts"],"sourcesContent":["'use client';\n\nimport styled from 'styled-components';\nimport { primary100 } from '@remember-web/mixin';\n\nexport const ToggleRoot = styled.label<{ $gap?: number }>`\n width: fit-content;\n height: fit-content;\n display: flex;\n ${({ $gap }) => $gap && `gap: ${$gap}px;`}\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > svg {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n :has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > svg {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n`;\n\nexport const ToggleInput = styled.input`\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ svg.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ svg.onIcon {\n display: none;\n }\n\n &:indeterminate ~ svg.offIcon,\n &:indeterminate ~ svg.onIcon {\n display: none;\n }\n\n &:not(:indeterminate) ~ svg.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ svg {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ svg {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ svg {\n outline: solid 2px ${primary100};\n outline-offset: -1px;\n }\n`;\n"],"names":["ToggleRoot","ToggleInput"],"mappings":";;;;;AAAa;AAKAA;AAIT;AAAO;AAAgC;AAsB9BC;;"}
1
+ {"version":3,"file":"styles.esm.js","sources":["../../../../src/Control/BaseToggle/styles.ts"],"sourcesContent":["'use client';\n\nimport styled from 'styled-components';\nimport { primary100 } from '@remember-web/mixin';\n\nexport const ToggleRoot = styled.label<{ $gap?: number }>`\n width: fit-content;\n height: fit-content;\n display: flex;\n ${({ $gap }) => $gap && `gap: ${$gap}px;`}\n\n cursor: pointer;\n user-select: none;\n align-items: center;\n\n & > .toggleIcon {\n transition: filter 0.2s ease-in-out;\n flex-shrink: 0;\n }\n\n &:has(input:disabled) {\n cursor: default;\n }\n\n @media (hover: hover) {\n &:hover > .toggleIcon {\n filter: grayscale(0.05) brightness(0.95);\n }\n }\n`;\n\nexport const ToggleInput = styled.input`\n all: unset;\n position: absolute;\n width: 1px;\n height: 0px;\n margin-left: -1px;\n\n &:checked ~ .toggleIcon.offIcon {\n display: none;\n }\n\n &:not(:checked) ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:indeterminate ~ .toggleIcon.offIcon,\n &[type='checkbox']:indeterminate ~ .toggleIcon.onIcon {\n display: none;\n }\n\n &[type='checkbox']:not(:indeterminate) ~ .toggleIcon.indeterminateIcon {\n display: none;\n }\n\n &:disabled ~ .toggleIcon {\n filter: grayscale(1) brightness(1.1);\n }\n\n &:not(:disabled):active ~ .toggleIcon {\n filter: grayscale(0.1) brightness(0.9);\n }\n\n &:focus-visible ~ .toggleIcon {\n outline: solid 2px ${primary100};\n outline-offset: -1px;\n }\n`;\n"],"names":["ToggleRoot","ToggleInput"],"mappings":";;;;;AAAa;AAKAA;AAIT;AAAO;AAAgC;AAsB9BC;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remember-web/primitive",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "Remember Web Primitive Components",
5
5
  "homepage": "https://dramancompany.github.io/remember-web-packages/",
6
6
  "author": "Remember",
@@ -19,6 +19,7 @@ import {
19
19
  type SvgSizeProps,
20
20
  type WithSvgSizeComponentType,
21
21
  } from '@remember-web/icon/util';
22
+ import styled from 'styled-components';
22
23
 
23
24
  import type { ToggleStatusType, ToggleVariantType } from '../types';
24
25
 
@@ -68,5 +69,17 @@ export function ToggleIcon({
68
69
 
69
70
  const Icon = ICON_NAME[variant][status];
70
71
 
71
- return <Icon className={className} size={iconSize} />;
72
+ return (
73
+ <ToggleIconContainer className={`toggleIcon ${className}`}>
74
+ <Icon size={iconSize} />
75
+ </ToggleIconContainer>
76
+ );
72
77
  }
78
+
79
+ const ToggleIconContainer = styled.div`
80
+ border-radius: 50%;
81
+
82
+ > svg {
83
+ display: block;
84
+ }
85
+ `;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import type { ForwardRefRenderFunction } from 'react';
4
- import { forwardRef } from 'react';
4
+ import { forwardRef, useCallback } from 'react';
5
5
 
6
6
  import { Typography } from '@/Common';
7
7
 
@@ -36,22 +36,27 @@ const _BaseToggle: ForwardRefRenderFunction<
36
36
  _label
37
37
  );
38
38
 
39
+ const refCallback = useCallback(
40
+ (input: HTMLInputElement | null) => {
41
+ if (ref) {
42
+ if (typeof ref === 'function') {
43
+ ref(input);
44
+ } else {
45
+ ref.current = input;
46
+ }
47
+ }
48
+
49
+ if (input) {
50
+ input.indeterminate = indeterminate ?? false;
51
+ }
52
+ },
53
+ [indeterminate, ref]
54
+ );
55
+
39
56
  return (
40
57
  <ToggleRoot className={className} $gap={labelGap}>
41
58
  <ToggleInput
42
- ref={(input) => {
43
- if (ref) {
44
- if (typeof ref === 'function') {
45
- ref(input);
46
- } else {
47
- ref.current = input;
48
- }
49
- }
50
-
51
- if (input) {
52
- input.indeterminate = indeterminate ?? false;
53
- }
54
- }}
59
+ ref={refCallback}
55
60
  className={inputClassName}
56
61
  type={type}
57
62
  {...props}
@@ -67,12 +72,14 @@ const _BaseToggle: ForwardRefRenderFunction<
67
72
  status="on"
68
73
  variant={variant}
69
74
  />
70
- <ToggleIcon
71
- className="indeterminateIcon"
72
- size={size}
73
- status="indeterminate"
74
- variant={variant}
75
- />
75
+ {type === 'checkbox' && (
76
+ <ToggleIcon
77
+ className="indeterminateIcon"
78
+ size={size}
79
+ status="indeterminate"
80
+ variant={variant}
81
+ />
82
+ )}
76
83
  <ToggleIcon
77
84
  className="offIcon"
78
85
  size={size}
@@ -13,17 +13,17 @@ export const ToggleRoot = styled.label<{ $gap?: number }>`
13
13
  user-select: none;
14
14
  align-items: center;
15
15
 
16
- & > svg {
16
+ & > .toggleIcon {
17
17
  transition: filter 0.2s ease-in-out;
18
18
  flex-shrink: 0;
19
19
  }
20
20
 
21
- :has(input:disabled) {
21
+ &:has(input:disabled) {
22
22
  cursor: default;
23
23
  }
24
24
 
25
25
  @media (hover: hover) {
26
- &:hover > svg {
26
+ &:hover > .toggleIcon {
27
27
  filter: grayscale(0.05) brightness(0.95);
28
28
  }
29
29
  }
@@ -36,32 +36,32 @@ export const ToggleInput = styled.input`
36
36
  height: 0px;
37
37
  margin-left: -1px;
38
38
 
39
- &:checked ~ svg.offIcon {
39
+ &:checked ~ .toggleIcon.offIcon {
40
40
  display: none;
41
41
  }
42
42
 
43
- &:not(:checked) ~ svg.onIcon {
43
+ &:not(:checked) ~ .toggleIcon.onIcon {
44
44
  display: none;
45
45
  }
46
46
 
47
- &:indeterminate ~ svg.offIcon,
48
- &:indeterminate ~ svg.onIcon {
47
+ &[type='checkbox']:indeterminate ~ .toggleIcon.offIcon,
48
+ &[type='checkbox']:indeterminate ~ .toggleIcon.onIcon {
49
49
  display: none;
50
50
  }
51
51
 
52
- &:not(:indeterminate) ~ svg.indeterminateIcon {
52
+ &[type='checkbox']:not(:indeterminate) ~ .toggleIcon.indeterminateIcon {
53
53
  display: none;
54
54
  }
55
55
 
56
- &:disabled ~ svg {
56
+ &:disabled ~ .toggleIcon {
57
57
  filter: grayscale(1) brightness(1.1);
58
58
  }
59
59
 
60
- &:not(:disabled):active ~ svg {
60
+ &:not(:disabled):active ~ .toggleIcon {
61
61
  filter: grayscale(0.1) brightness(0.9);
62
62
  }
63
63
 
64
- &:focus-visible ~ svg {
64
+ &:focus-visible ~ .toggleIcon {
65
65
  outline: solid 2px ${primary100};
66
66
  outline-offset: -1px;
67
67
  }
@@ -1,6 +1,7 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
 
3
3
  import { Radio } from './Radio';
4
+ import { useState } from 'react';
4
5
 
5
6
  type Story = StoryObj<typeof Radio>;
6
7
 
@@ -20,17 +21,69 @@ export const Default: Story = {
20
21
  labelPosition: 'right',
21
22
  label: "I'm a Radio",
22
23
  },
23
- render: ({ ...args }) => (
24
- <div>
25
- <Radio {...args} name="radio" value="1" label="1번 라디오 입니다." />
26
- <Radio {...args} name="radio" value="2" label="2번 라디오 입니다." />
27
- <Radio {...args} name="radio" value="3" label="3번 라디오 입니다." />
28
- <Radio {...args} name="radio" value="4" label="4번 라디오 입니다." />
29
- <Radio {...args} name="radio" value="5" label="5번 라디오 입니다." />
30
- <Radio {...args} name="radio" value="6" label="6번 라디오 입니다." />
31
- <Radio {...args} name="radio" value="7" label="7번 라디오 입니다." />
32
- </div>
33
- ),
24
+ render: ({ ...args }) => {
25
+ const [value, setValue] = useState<string | null>(null);
26
+ return (
27
+ <>
28
+ <div>
29
+ <h2>name으로 묶은 uncontrolled 라디오</h2>
30
+ <Radio {...args} name="radio" value="1" label="1번 라디오 입니다." />
31
+ <Radio {...args} name="radio" value="2" label="2번 라디오 입니다." />
32
+ <Radio {...args} name="radio" value="3" label="3번 라디오 입니다." />
33
+ <Radio {...args} name="radio" value="4" label="4번 라디오 입니다." />
34
+ <Radio {...args} name="radio" value="5" label="5번 라디오 입니다." />
35
+ <Radio {...args} name="radio" value="6" label="6번 라디오 입니다." />
36
+ <Radio {...args} name="radio" value="7" label="7번 라디오 입니다." />
37
+ </div>
38
+
39
+ <div>
40
+ <h2>state로 관리하는 controlled 라디오</h2>
41
+ <Radio
42
+ {...args}
43
+ checked={value === '1'}
44
+ onClick={() => setValue('1')}
45
+ label="1번 라디오 입니다."
46
+ />
47
+ <Radio
48
+ {...args}
49
+ checked={value === '2'}
50
+ onClick={() => setValue('2')}
51
+ label="2번 라디오 입니다."
52
+ />
53
+ <Radio
54
+ {...args}
55
+ checked={value === '3'}
56
+ onClick={() => setValue('3')}
57
+ label="3번 라디오 입니다."
58
+ />
59
+ <Radio
60
+ {...args}
61
+ checked={value === '4'}
62
+ onClick={() => setValue('4')}
63
+ label="4번 라디오 입니다."
64
+ />
65
+ <Radio
66
+ {...args}
67
+ checked={value === '5'}
68
+ onClick={() => setValue('5')}
69
+ label="5번 라디오 입니다."
70
+ />
71
+ <Radio
72
+ {...args}
73
+ checked={value === '6'}
74
+ onClick={() => setValue('6')}
75
+ label="6번 라디오 입니다."
76
+ />
77
+ <Radio
78
+ {...args}
79
+ checked={value === '7'}
80
+ onClick={() => setValue('7')}
81
+ label="7번 라디오 입니다."
82
+ />
83
+ </div>
84
+ </>
85
+ );
86
+ },
34
87
  };
35
88
 
36
89
  export default meta;