@os-design/core 1.0.198 → 1.0.200

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 (104) hide show
  1. package/dist/cjs/InputSearch/index.js +2 -2
  2. package/dist/cjs/InputSearch/index.js.map +1 -1
  3. package/dist/esm/InputSearch/index.js +2 -2
  4. package/dist/esm/InputSearch/index.js.map +1 -1
  5. package/dist/types/InputSearch/index.d.ts.map +1 -1
  6. package/package.json +21 -13
  7. package/src/@types/emotion.d.ts +7 -0
  8. package/src/Alert/index.tsx +112 -0
  9. package/src/Avatar/index.tsx +173 -0
  10. package/src/Avatar/utils/nameToInitials.ts +12 -0
  11. package/src/Avatar/utils/strToHue.ts +13 -0
  12. package/src/AvatarSkeleton/index.tsx +29 -0
  13. package/src/Breadcrumb/index.tsx +93 -0
  14. package/src/BreadcrumbItem/index.tsx +83 -0
  15. package/src/Button/ButtonContent.tsx +91 -0
  16. package/src/Button/index.tsx +225 -0
  17. package/src/Button/utils/useButtonColors.ts +84 -0
  18. package/src/Checkbox/index.tsx +225 -0
  19. package/src/CheckboxSkeleton/index.tsx +50 -0
  20. package/src/DatePicker/DatePickerCalendar.tsx +220 -0
  21. package/src/DatePicker/index.tsx +568 -0
  22. package/src/Drawer/index.tsx +212 -0
  23. package/src/Form/FormConfigContext.ts +16 -0
  24. package/src/Form/index.tsx +49 -0
  25. package/src/FormDivider/index.tsx +74 -0
  26. package/src/FormItem/index.tsx +118 -0
  27. package/src/Gallery/Status.tsx +62 -0
  28. package/src/Gallery/index.tsx +290 -0
  29. package/src/GlobalStyles/index.tsx +17 -0
  30. package/src/GlobalStyles/resetStyles.ts +17 -0
  31. package/src/GlobalStyles/typographyStyles.ts +78 -0
  32. package/src/HeaderSkeleton/index.tsx +64 -0
  33. package/src/Image/index.tsx +104 -0
  34. package/src/ImageSkeleton/index.tsx +22 -0
  35. package/src/Input/index.tsx +330 -0
  36. package/src/Input/utils/getFocusableElements.ts +8 -0
  37. package/src/InputNumber/index.tsx +208 -0
  38. package/src/InputNumber/utils/defaultLocale.ts +9 -0
  39. package/src/InputPassword/index.tsx +201 -0
  40. package/src/InputPassword/utils/defaultLocale.ts +11 -0
  41. package/src/InputSearch/index.tsx +111 -0
  42. package/src/InputSearch/utils/defaultLocale.ts +9 -0
  43. package/src/InputSkeleton/index.tsx +28 -0
  44. package/src/Layout/LayoutContext.ts +21 -0
  45. package/src/Layout/index.tsx +44 -0
  46. package/src/Link/index.tsx +129 -0
  47. package/src/LinkButton/index.tsx +100 -0
  48. package/src/List/WindowScroller.tsx +53 -0
  49. package/src/List/index.tsx +255 -0
  50. package/src/List/utils/bodyPointerEvents.ts +24 -0
  51. package/src/List/utils/frameTimeout.ts +36 -0
  52. package/src/List/utils/useRWLoadNext.ts +38 -0
  53. package/src/ListItem/index.tsx +92 -0
  54. package/src/ListItemActions/index.tsx +207 -0
  55. package/src/ListItemLink/index.tsx +63 -0
  56. package/src/ListSkeleton/index.tsx +115 -0
  57. package/src/LogoLink/index.tsx +93 -0
  58. package/src/LogoLink/logo.example.svg +18 -0
  59. package/src/Menu/index.tsx +128 -0
  60. package/src/Menu/utils/useFocusWithArrows.ts +50 -0
  61. package/src/MenuDivider/index.tsx +22 -0
  62. package/src/MenuGroup/index.tsx +190 -0
  63. package/src/MenuItem/index.tsx +108 -0
  64. package/src/Modal/index.tsx +411 -0
  65. package/src/Modal/utils/defaultLocale.ts +9 -0
  66. package/src/Navigation/index.tsx +214 -0
  67. package/src/Navigation/utils/useScrollFlags.ts +39 -0
  68. package/src/NavigationItem/index.tsx +136 -0
  69. package/src/PageContent/index.tsx +99 -0
  70. package/src/PageHeader/index.tsx +246 -0
  71. package/src/PageHeader/utils/defaultLocale.ts +9 -0
  72. package/src/PageHeaderInputSearch/index.tsx +145 -0
  73. package/src/PageHeaderInputSearch/utils/defaultLocale.ts +16 -0
  74. package/src/PageHeaderSkeleton/index.tsx +33 -0
  75. package/src/ParagraphSkeleton/index.tsx +65 -0
  76. package/src/Popover/index.tsx +243 -0
  77. package/src/Popover/utils/usePopoverPosition.ts +216 -0
  78. package/src/Progress/index.tsx +100 -0
  79. package/src/RadioGroup/index.tsx +165 -0
  80. package/src/RadioGroupSkeleton/index.tsx +36 -0
  81. package/src/Result/index.tsx +109 -0
  82. package/src/ScrollButton/index.tsx +159 -0
  83. package/src/ScrollButton/utils/useContainerPosition.ts +41 -0
  84. package/src/ScrollButton/utils/useVisibility.ts +56 -0
  85. package/src/Select/index.tsx +970 -0
  86. package/src/Select/utils/defaultLocale.ts +11 -0
  87. package/src/Skeleton/index.tsx +52 -0
  88. package/src/Switch/index.tsx +217 -0
  89. package/src/SwitchSkeleton/index.tsx +30 -0
  90. package/src/Tag/index.tsx +75 -0
  91. package/src/TagLink/index.tsx +53 -0
  92. package/src/TagList/index.tsx +95 -0
  93. package/src/TagListSkeleton/index.tsx +38 -0
  94. package/src/TagSkeleton/index.tsx +40 -0
  95. package/src/TextArea/index.tsx +231 -0
  96. package/src/TextAreaSkeleton/index.tsx +20 -0
  97. package/src/ThemeSwitcher/index.tsx +39 -0
  98. package/src/TimePicker/index.tsx +142 -0
  99. package/src/Video/index.tsx +41 -0
  100. package/src/index.ts +125 -0
  101. package/src/message/AlertIcon.tsx +50 -0
  102. package/src/message/Message.tsx +108 -0
  103. package/src/message/index.tsx +64 -0
  104. package/src/message/styles.ts +25 -0
@@ -64,9 +64,9 @@ var InputSearch = /*#__PURE__*/(0, _react2.forwardRef)(function (_ref, ref) {
64
64
  setForwardedValue = _useForwardedState2[1];
65
65
  return /*#__PURE__*/_react2["default"].createElement(_Input["default"], _extends({
66
66
  type: "text",
67
- left: /*#__PURE__*/_react2["default"].createElement(_react2["default"].Fragment, null, /*#__PURE__*/_react2["default"].createElement(_icons.Search, {
67
+ left: left || /*#__PURE__*/_react2["default"].createElement(_icons.Search, {
68
68
  key: "search-icon"
69
- }), left),
69
+ }),
70
70
  leftHasPadding: leftHasPadding,
71
71
  right: /*#__PURE__*/_react2["default"].createElement(_react2["default"].Fragment, null, !!forwardedValue && /*#__PURE__*/_react2["default"].createElement(_theming.ThemeOverrider, {
72
72
  overrides: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_react","require","_styled","_interopRequireDefault","_icons","_theming","_utils","_react2","_interopRequireWildcard","_Button","_Input","_defaultLocale","_excluded","_templateObject","_templateObject2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","o","minLen","_arrayLikeToArray","n","toString","slice","constructor","name","Array","from","test","len","arr2","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","next","done","push","value","err","isArray","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","keys","_taggedTemplateLiteral","strings","raw","freeze","defineProperties","fadeIn","keyframes","ClearButton","styled","Button","p","theme","transitionDelay","InputSearch","forwardRef","_ref","ref","_ref$locale","locale","defaultLocale","defaultValue","_ref$onChange","onChange","disabled","left","_ref$leftHasPadding","leftHasPadding","right","rest","_useForwardedRef","useForwardedRef","_useForwardedRef2","inputRef","mergedInputRef","_useForwardedState","useForwardedState","_useForwardedState2","forwardedValue","setForwardedValue","createElement","type","Fragment","Search","ThemeOverrider","overrides","buttonIconScaleFactor","wide","size","onClick","current","focus","clearLabel","CloseCircle","role","displayName","_default","exports"],"sources":["../../../src/InputSearch/index.tsx"],"sourcesContent":["import { keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { CloseCircle, Search } from '@os-design/icons';\nimport { ThemeOverrider } from '@os-design/theming';\n\nimport { useForwardedRef, useForwardedState } from '@os-design/utils';\nimport React, { forwardRef } from 'react';\nimport Button from '../Button';\n\nimport Input, { InputProps } from '../Input';\n\nimport defaultLocale, { InputSearchLocale } from './utils/defaultLocale';\n\nexport interface InputSearchProps\n extends Omit<InputProps, 'type' | 'onChange'> {\n /**\n * The locale.\n * @default undefined\n */\n locale?: InputSearchLocale;\n /**\n * The input value.\n * @default undefined\n */\n value?: string;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string) => void;\n}\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst ClearButton = styled(Button)`\n animation: ${fadeIn} ${(p) => p.theme.transitionDelay}ms;\n`;\n\n/**\n * The search input.\n */\nconst InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(\n (\n {\n locale = defaultLocale,\n value,\n defaultValue,\n onChange = () => {},\n disabled,\n left,\n leftHasPadding = true,\n right,\n ...rest\n },\n ref\n ) => {\n const [inputRef, mergedInputRef] = useForwardedRef(ref);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n return (\n <Input\n type='text'\n left={\n <>\n <Search key='search-icon' />\n {left}\n </>\n }\n leftHasPadding={leftHasPadding}\n right={\n <>\n {!!forwardedValue && (\n <ThemeOverrider overrides={{ buttonIconScaleFactor: 1.2 }}>\n <ClearButton\n key='clear-button'\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={() => {\n setForwardedValue('');\n if (!inputRef.current) return;\n inputRef.current.focus();\n }}\n aria-label={locale.clearLabel}\n >\n <CloseCircle />\n </ClearButton>\n </ThemeOverrider>\n )}\n {right}\n </>\n }\n value={forwardedValue}\n onChange={setForwardedValue}\n role='searchbox'\n disabled={disabled}\n {...rest}\n ref={mergedInputRef}\n />\n );\n }\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_react","require","_styled","_interopRequireDefault","_icons","_theming","_utils","_react2","_interopRequireWildcard","_Button","_Input","_defaultLocale","_excluded","_templateObject","_templateObject2","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","_extends","assign","bind","target","i","arguments","length","source","apply","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","TypeError","o","minLen","_arrayLikeToArray","n","toString","slice","constructor","name","Array","from","test","len","arr2","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","next","done","push","value","err","isArray","_objectWithoutProperties","excluded","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","indexOf","propertyIsEnumerable","sourceKeys","keys","_taggedTemplateLiteral","strings","raw","freeze","defineProperties","fadeIn","keyframes","ClearButton","styled","Button","p","theme","transitionDelay","InputSearch","forwardRef","_ref","ref","_ref$locale","locale","defaultLocale","defaultValue","_ref$onChange","onChange","disabled","left","_ref$leftHasPadding","leftHasPadding","right","rest","_useForwardedRef","useForwardedRef","_useForwardedRef2","inputRef","mergedInputRef","_useForwardedState","useForwardedState","_useForwardedState2","forwardedValue","setForwardedValue","createElement","type","Search","Fragment","ThemeOverrider","overrides","buttonIconScaleFactor","wide","size","onClick","current","focus","clearLabel","CloseCircle","role","displayName","_default","exports"],"sources":["../../../src/InputSearch/index.tsx"],"sourcesContent":["import { keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { CloseCircle, Search } from '@os-design/icons';\nimport { ThemeOverrider } from '@os-design/theming';\nimport { useForwardedRef, useForwardedState } from '@os-design/utils';\nimport React, { forwardRef } from 'react';\nimport Button from '../Button';\nimport Input, { InputProps } from '../Input';\nimport defaultLocale, { InputSearchLocale } from './utils/defaultLocale';\n\nexport interface InputSearchProps\n extends Omit<InputProps, 'type' | 'onChange'> {\n /**\n * The locale.\n * @default undefined\n */\n locale?: InputSearchLocale;\n /**\n * The input value.\n * @default undefined\n */\n value?: string;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string) => void;\n}\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst ClearButton = styled(Button)`\n animation: ${fadeIn} ${(p) => p.theme.transitionDelay}ms;\n`;\n\n/**\n * The search input.\n */\nconst InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(\n (\n {\n locale = defaultLocale,\n value,\n defaultValue,\n onChange = () => {},\n disabled,\n left,\n leftHasPadding = true,\n right,\n ...rest\n },\n ref\n ) => {\n const [inputRef, mergedInputRef] = useForwardedRef(ref);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n return (\n <Input\n type='text'\n left={left || <Search key='search-icon' />}\n leftHasPadding={leftHasPadding}\n right={\n <>\n {!!forwardedValue && (\n <ThemeOverrider overrides={{ buttonIconScaleFactor: 1.2 }}>\n <ClearButton\n key='clear-button'\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={() => {\n setForwardedValue('');\n if (!inputRef.current) return;\n inputRef.current.focus();\n }}\n aria-label={locale.clearLabel}\n >\n <CloseCircle />\n </ClearButton>\n </ThemeOverrider>\n )}\n {right}\n </>\n }\n value={forwardedValue}\n onChange={setForwardedValue}\n role='searchbox'\n disabled={disabled}\n {...rest}\n ref={mergedInputRef}\n />\n );\n }\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n"],"mappings":"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"}
@@ -38,9 +38,9 @@ const InputSearch = /*#__PURE__*/forwardRef(({
38
38
  });
39
39
  return /*#__PURE__*/React.createElement(Input, _extends({
40
40
  type: "text",
41
- left: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Search, {
41
+ left: left || /*#__PURE__*/React.createElement(Search, {
42
42
  key: "search-icon"
43
- }), left),
43
+ }),
44
44
  leftHasPadding: leftHasPadding,
45
45
  right: /*#__PURE__*/React.createElement(React.Fragment, null, !!forwardedValue && /*#__PURE__*/React.createElement(ThemeOverrider, {
46
46
  overrides: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["keyframes","styled","CloseCircle","Search","ThemeOverrider","useForwardedRef","useForwardedState","React","forwardRef","Button","Input","defaultLocale","fadeIn","ClearButton","p","theme","transitionDelay","InputSearch","locale","value","defaultValue","onChange","disabled","left","leftHasPadding","right","rest","ref","inputRef","mergedInputRef","forwardedValue","setForwardedValue","createElement","_extends","type","Fragment","key","overrides","buttonIconScaleFactor","wide","size","onClick","current","focus","clearLabel","role","displayName"],"sources":["../../../src/InputSearch/index.tsx"],"sourcesContent":["import { keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { CloseCircle, Search } from '@os-design/icons';\nimport { ThemeOverrider } from '@os-design/theming';\n\nimport { useForwardedRef, useForwardedState } from '@os-design/utils';\nimport React, { forwardRef } from 'react';\nimport Button from '../Button';\n\nimport Input, { InputProps } from '../Input';\n\nimport defaultLocale, { InputSearchLocale } from './utils/defaultLocale';\n\nexport interface InputSearchProps\n extends Omit<InputProps, 'type' | 'onChange'> {\n /**\n * The locale.\n * @default undefined\n */\n locale?: InputSearchLocale;\n /**\n * The input value.\n * @default undefined\n */\n value?: string;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string) => void;\n}\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst ClearButton = styled(Button)`\n animation: ${fadeIn} ${(p) => p.theme.transitionDelay}ms;\n`;\n\n/**\n * The search input.\n */\nconst InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(\n (\n {\n locale = defaultLocale,\n value,\n defaultValue,\n onChange = () => {},\n disabled,\n left,\n leftHasPadding = true,\n right,\n ...rest\n },\n ref\n ) => {\n const [inputRef, mergedInputRef] = useForwardedRef(ref);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n return (\n <Input\n type='text'\n left={\n <>\n <Search key='search-icon' />\n {left}\n </>\n }\n leftHasPadding={leftHasPadding}\n right={\n <>\n {!!forwardedValue && (\n <ThemeOverrider overrides={{ buttonIconScaleFactor: 1.2 }}>\n <ClearButton\n key='clear-button'\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={() => {\n setForwardedValue('');\n if (!inputRef.current) return;\n inputRef.current.focus();\n }}\n aria-label={locale.clearLabel}\n >\n <CloseCircle />\n </ClearButton>\n </ThemeOverrider>\n )}\n {right}\n </>\n }\n value={forwardedValue}\n onChange={setForwardedValue}\n role='searchbox'\n disabled={disabled}\n {...rest}\n ref={mergedInputRef}\n />\n );\n }\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n"],"mappings":";AAAA,SAASA,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,iBAAiB;AACpC,SAASC,WAAW,EAAEC,MAAM,QAAQ,kBAAkB;AACtD,SAASC,cAAc,QAAQ,oBAAoB;AAEnD,SAASC,eAAe,EAAEC,iBAAiB,QAAQ,kBAAkB;AACrE,OAAOC,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,MAAM,MAAM,WAAW;AAE9B,OAAOC,KAAK,MAAsB,UAAU;AAE5C,OAAOC,aAAa,MAA6B,uBAAuB;AA0BxE,MAAMC,MAAM,GAAGZ,SAAU;AACzB;AACA;AACA,CAAC;AAED,MAAMa,WAAW,GAAGZ,MAAM,CAACQ,MAAM,CAAE;AACnC,eAAeG,MAAO,IAAIE,CAAC,IAAKA,CAAC,CAACC,KAAK,CAACC,eAAgB;AACxD,CAAC;;AAED;AACA;AACA;AACA,MAAMC,WAAW,gBAAGT,UAAU,CAC5B,CACE;EACEU,MAAM,GAAGP,aAAa;EACtBQ,KAAK;EACLC,YAAY;EACZC,QAAQ,GAAGA,CAAA,KAAM,CAAC,CAAC;EACnBC,QAAQ;EACRC,IAAI;EACJC,cAAc,GAAG,IAAI;EACrBC,KAAK;EACL,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAM,CAACC,QAAQ,EAAEC,cAAc,CAAC,GAAGxB,eAAe,CAACsB,GAAG,CAAC;EACvD,MAAM,CAACG,cAAc,EAAEC,iBAAiB,CAAC,GAAGzB,iBAAiB,CAAC;IAC5Da,KAAK;IACLC,YAAY;IACZC;EACF,CAAC,CAAC;EAEF,oBACEd,KAAA,CAAAyB,aAAA,CAACtB,KAAK,EAAAuB,QAAA;IACJC,IAAI,EAAC,MAAM;IACXX,IAAI,eACFhB,KAAA,CAAAyB,aAAA,CAAAzB,KAAA,CAAA4B,QAAA,qBACE5B,KAAA,CAAAyB,aAAA,CAAC7B,MAAM;MAACiC,GAAG,EAAC;IAAa,CAAE,CAAC,EAC3Bb,IACD,CACH;IACDC,cAAc,EAAEA,cAAe;IAC/BC,KAAK,eACHlB,KAAA,CAAAyB,aAAA,CAAAzB,KAAA,CAAA4B,QAAA,QACG,CAAC,CAACL,cAAc,iBACfvB,KAAA,CAAAyB,aAAA,CAAC5B,cAAc;MAACiC,SAAS,EAAE;QAAEC,qBAAqB,EAAE;MAAI;IAAE,gBACxD/B,KAAA,CAAAyB,aAAA,CAACnB,WAAW;MACVuB,GAAG,EAAC,cAAc;MAClBF,IAAI,EAAC,OAAO;MACZK,IAAI,EAAC,OAAO;MACZC,IAAI,EAAC,OAAO;MACZlB,QAAQ,EAAEA,QAAS;MACnBmB,OAAO,EAAEA,CAAA,KAAM;QACbV,iBAAiB,CAAC,EAAE,CAAC;QACrB,IAAI,CAACH,QAAQ,CAACc,OAAO,EAAE;QACvBd,QAAQ,CAACc,OAAO,CAACC,KAAK,CAAC,CAAC;MAC1B,CAAE;MACF,cAAYzB,MAAM,CAAC0B;IAAW,gBAE9BrC,KAAA,CAAAyB,aAAA,CAAC9B,WAAW,MAAE,CACH,CACC,CACjB,EACAuB,KACD,CACH;IACDN,KAAK,EAAEW,cAAe;IACtBT,QAAQ,EAAEU,iBAAkB;IAC5Bc,IAAI,EAAC,WAAW;IAChBvB,QAAQ,EAAEA;EAAS,GACfI,IAAI;IACRC,GAAG,EAAEE;EAAe,EACrB,CAAC;AAEN,CACF,CAAC;AAEDZ,WAAW,CAAC6B,WAAW,GAAG,aAAa;AAEvC,eAAe7B,WAAW"}
1
+ {"version":3,"file":"index.js","names":["keyframes","styled","CloseCircle","Search","ThemeOverrider","useForwardedRef","useForwardedState","React","forwardRef","Button","Input","defaultLocale","fadeIn","ClearButton","p","theme","transitionDelay","InputSearch","locale","value","defaultValue","onChange","disabled","left","leftHasPadding","right","rest","ref","inputRef","mergedInputRef","forwardedValue","setForwardedValue","createElement","_extends","type","key","Fragment","overrides","buttonIconScaleFactor","wide","size","onClick","current","focus","clearLabel","role","displayName"],"sources":["../../../src/InputSearch/index.tsx"],"sourcesContent":["import { keyframes } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { CloseCircle, Search } from '@os-design/icons';\nimport { ThemeOverrider } from '@os-design/theming';\nimport { useForwardedRef, useForwardedState } from '@os-design/utils';\nimport React, { forwardRef } from 'react';\nimport Button from '../Button';\nimport Input, { InputProps } from '../Input';\nimport defaultLocale, { InputSearchLocale } from './utils/defaultLocale';\n\nexport interface InputSearchProps\n extends Omit<InputProps, 'type' | 'onChange'> {\n /**\n * The locale.\n * @default undefined\n */\n locale?: InputSearchLocale;\n /**\n * The input value.\n * @default undefined\n */\n value?: string;\n /**\n * The default value.\n * @default undefined\n */\n defaultValue?: string;\n /**\n * The change event handler.\n * @default undefined\n */\n onChange?: (value: string) => void;\n}\n\nconst fadeIn = keyframes`\n from { opacity: 0; }\n to { opacity: 1; }\n`;\n\nconst ClearButton = styled(Button)`\n animation: ${fadeIn} ${(p) => p.theme.transitionDelay}ms;\n`;\n\n/**\n * The search input.\n */\nconst InputSearch = forwardRef<HTMLInputElement, InputSearchProps>(\n (\n {\n locale = defaultLocale,\n value,\n defaultValue,\n onChange = () => {},\n disabled,\n left,\n leftHasPadding = true,\n right,\n ...rest\n },\n ref\n ) => {\n const [inputRef, mergedInputRef] = useForwardedRef(ref);\n const [forwardedValue, setForwardedValue] = useForwardedState({\n value,\n defaultValue,\n onChange,\n });\n\n return (\n <Input\n type='text'\n left={left || <Search key='search-icon' />}\n leftHasPadding={leftHasPadding}\n right={\n <>\n {!!forwardedValue && (\n <ThemeOverrider overrides={{ buttonIconScaleFactor: 1.2 }}>\n <ClearButton\n key='clear-button'\n type='ghost'\n wide='never'\n size='small'\n disabled={disabled}\n onClick={() => {\n setForwardedValue('');\n if (!inputRef.current) return;\n inputRef.current.focus();\n }}\n aria-label={locale.clearLabel}\n >\n <CloseCircle />\n </ClearButton>\n </ThemeOverrider>\n )}\n {right}\n </>\n }\n value={forwardedValue}\n onChange={setForwardedValue}\n role='searchbox'\n disabled={disabled}\n {...rest}\n ref={mergedInputRef}\n />\n );\n }\n);\n\nInputSearch.displayName = 'InputSearch';\n\nexport default InputSearch;\n"],"mappings":";AAAA,SAASA,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,iBAAiB;AACpC,SAASC,WAAW,EAAEC,MAAM,QAAQ,kBAAkB;AACtD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,eAAe,EAAEC,iBAAiB,QAAQ,kBAAkB;AACrE,OAAOC,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,MAAM,MAAM,WAAW;AAC9B,OAAOC,KAAK,MAAsB,UAAU;AAC5C,OAAOC,aAAa,MAA6B,uBAAuB;AA0BxE,MAAMC,MAAM,GAAGZ,SAAU;AACzB;AACA;AACA,CAAC;AAED,MAAMa,WAAW,GAAGZ,MAAM,CAACQ,MAAM,CAAE;AACnC,eAAeG,MAAO,IAAIE,CAAC,IAAKA,CAAC,CAACC,KAAK,CAACC,eAAgB;AACxD,CAAC;;AAED;AACA;AACA;AACA,MAAMC,WAAW,gBAAGT,UAAU,CAC5B,CACE;EACEU,MAAM,GAAGP,aAAa;EACtBQ,KAAK;EACLC,YAAY;EACZC,QAAQ,GAAGA,CAAA,KAAM,CAAC,CAAC;EACnBC,QAAQ;EACRC,IAAI;EACJC,cAAc,GAAG,IAAI;EACrBC,KAAK;EACL,GAAGC;AACL,CAAC,EACDC,GAAG,KACA;EACH,MAAM,CAACC,QAAQ,EAAEC,cAAc,CAAC,GAAGxB,eAAe,CAACsB,GAAG,CAAC;EACvD,MAAM,CAACG,cAAc,EAAEC,iBAAiB,CAAC,GAAGzB,iBAAiB,CAAC;IAC5Da,KAAK;IACLC,YAAY;IACZC;EACF,CAAC,CAAC;EAEF,oBACEd,KAAA,CAAAyB,aAAA,CAACtB,KAAK,EAAAuB,QAAA;IACJC,IAAI,EAAC,MAAM;IACXX,IAAI,EAAEA,IAAI,iBAAIhB,KAAA,CAAAyB,aAAA,CAAC7B,MAAM;MAACgC,GAAG,EAAC;IAAa,CAAE,CAAE;IAC3CX,cAAc,EAAEA,cAAe;IAC/BC,KAAK,eACHlB,KAAA,CAAAyB,aAAA,CAAAzB,KAAA,CAAA6B,QAAA,QACG,CAAC,CAACN,cAAc,iBACfvB,KAAA,CAAAyB,aAAA,CAAC5B,cAAc;MAACiC,SAAS,EAAE;QAAEC,qBAAqB,EAAE;MAAI;IAAE,gBACxD/B,KAAA,CAAAyB,aAAA,CAACnB,WAAW;MACVsB,GAAG,EAAC,cAAc;MAClBD,IAAI,EAAC,OAAO;MACZK,IAAI,EAAC,OAAO;MACZC,IAAI,EAAC,OAAO;MACZlB,QAAQ,EAAEA,QAAS;MACnBmB,OAAO,EAAEA,CAAA,KAAM;QACbV,iBAAiB,CAAC,EAAE,CAAC;QACrB,IAAI,CAACH,QAAQ,CAACc,OAAO,EAAE;QACvBd,QAAQ,CAACc,OAAO,CAACC,KAAK,CAAC,CAAC;MAC1B,CAAE;MACF,cAAYzB,MAAM,CAAC0B;IAAW,gBAE9BrC,KAAA,CAAAyB,aAAA,CAAC9B,WAAW,MAAE,CACH,CACC,CACjB,EACAuB,KACD,CACH;IACDN,KAAK,EAAEW,cAAe;IACtBT,QAAQ,EAAEU,iBAAkB;IAC5Bc,IAAI,EAAC,WAAW;IAChBvB,QAAQ,EAAEA;EAAS,GACfI,IAAI;IACRC,GAAG,EAAEE;EAAe,EACrB,CAAC;AAEN,CACF,CAAC;AAEDZ,WAAW,CAAC6B,WAAW,GAAG,aAAa;AAEvC,eAAe7B,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/InputSearch/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,OAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC;IAK7C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAK3B,KAAK,CAAC,EAAE,MAAM,CAAC;IAKf,YAAY,CAAC,EAAE,MAAM,CAAC;IAKtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAcD,QAAA,MAAM,WAAW,2FAiEhB,CAAC;AAIF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/InputSearch/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAsB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC;IAK7C,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAK3B,KAAK,CAAC,EAAE,MAAM,CAAC;IAKf,YAAY,CAAC,EAAE,MAAM,CAAC;IAKtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAcD,QAAA,MAAM,WAAW,2FA4DhB,CAAC;AAIF,eAAe,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@os-design/core",
3
- "version": "1.0.198",
3
+ "version": "1.0.200",
4
4
  "license": "UNLICENSED",
5
5
  "repository": "git@gitlab.com:os-team/libs/os-design.git",
6
6
  "main": "dist/cjs/index.js",
@@ -14,7 +14,15 @@
14
14
  "./package.json": "./package.json"
15
15
  },
16
16
  "files": [
17
- "dist"
17
+ "dist",
18
+ "src",
19
+ "!**/*.test.ts",
20
+ "!**/*.test.tsx",
21
+ "!**/__tests__",
22
+ "!**/*.stories.tsx",
23
+ "!**/*.stories.mdx",
24
+ "!**/*.example.tsx",
25
+ "!**/*.emotion.d.ts"
18
26
  ],
19
27
  "sideEffects": false,
20
28
  "scripts": {
@@ -29,16 +37,16 @@
29
37
  "access": "public"
30
38
  },
31
39
  "dependencies": {
32
- "@os-design/date-picker-utils": "^1.0.16",
33
- "@os-design/icons": "^1.0.47",
34
- "@os-design/input-number-utils": "^1.0.21",
35
- "@os-design/media": "^1.0.18",
36
- "@os-design/menu-utils": "^1.0.14",
37
- "@os-design/portal": "^1.0.10",
38
- "@os-design/styles": "^1.0.44",
39
- "@os-design/theming": "^1.0.42",
40
- "@os-design/time-picker-utils": "^1.0.7",
41
- "@os-design/utils": "^1.0.60",
40
+ "@os-design/date-picker-utils": "^1.0.17",
41
+ "@os-design/icons": "^1.0.48",
42
+ "@os-design/input-number-utils": "^1.0.22",
43
+ "@os-design/media": "^1.0.19",
44
+ "@os-design/menu-utils": "^1.0.15",
45
+ "@os-design/portal": "^1.0.11",
46
+ "@os-design/styles": "^1.0.45",
47
+ "@os-design/theming": "^1.0.43",
48
+ "@os-design/time-picker-utils": "^1.0.8",
49
+ "@os-design/utils": "^1.0.62",
42
50
  "@os-team/password-score": "^1.0.4",
43
51
  "facepaint": "^1.2.1",
44
52
  "react-focus-lock": "^2.9.4",
@@ -58,5 +66,5 @@
58
66
  "react": ">=18",
59
67
  "react-dom": ">=18"
60
68
  },
61
- "gitHead": "8791b7a1da0d71fb3e47d0df630e835c8221cfa9"
69
+ "gitHead": "3d6b264027712ef81a75379fe3fde3c76c3079af"
62
70
  }
@@ -0,0 +1,7 @@
1
+ import '@emotion/react';
2
+ import { Theme as BaseTheme } from '@os-design/theming';
3
+
4
+ declare module '@emotion/react' {
5
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
6
+ export interface Theme extends BaseTheme {}
7
+ }
@@ -0,0 +1,112 @@
1
+ import { css } from '@emotion/react';
2
+ import styled from '@emotion/styled';
3
+
4
+ import { CheckCircle, CloseCircle, InfoCircle } from '@os-design/icons';
5
+ import { WithSize, sizeStyles } from '@os-design/styles';
6
+ import { clr } from '@os-design/theming';
7
+ import { omitEmotionProps } from '@os-design/utils';
8
+ import React, { forwardRef, useMemo } from 'react';
9
+
10
+ type JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;
11
+ export interface AlertProps extends JsxDivProps, WithSize {
12
+ /**
13
+ * Type of styles.
14
+ */
15
+ type: 'info' | 'success' | 'error';
16
+ }
17
+
18
+ const infoContainerStyles = (p) =>
19
+ p.type === 'info' &&
20
+ css`
21
+ background-color: ${clr(p.theme.alertInfoColorBg)};
22
+ `;
23
+
24
+ const successContainerStyles = (p) =>
25
+ p.type === 'success' &&
26
+ css`
27
+ background-color: ${clr(p.theme.alertSuccessColorBg)};
28
+ `;
29
+
30
+ const errorContainerStyles = (p) =>
31
+ p.type === 'error' &&
32
+ css`
33
+ background-color: ${clr(p.theme.alertErrorColorBg)};
34
+ `;
35
+
36
+ type ContainerProps = Pick<AlertProps, 'type' | 'size'>;
37
+ const Container = styled(
38
+ 'div',
39
+ omitEmotionProps('type', 'size')
40
+ )<ContainerProps>`
41
+ display: flex;
42
+ flex-direction: row;
43
+ align-items: center;
44
+
45
+ padding: 1em;
46
+ border-radius: ${(p) => p.theme.borderRadius}em;
47
+ color: ${(p) => clr(p.theme.colorText)};
48
+
49
+ ${infoContainerStyles};
50
+ ${successContainerStyles};
51
+ ${errorContainerStyles};
52
+ ${sizeStyles};
53
+ `;
54
+
55
+ const infoIconContainerStyles = (p) =>
56
+ p.type === 'info' &&
57
+ css`
58
+ color: ${clr(p.theme.alertInfoColorIcon)};
59
+ `;
60
+
61
+ const successIconContainerStyles = (p) =>
62
+ p.type === 'success' &&
63
+ css`
64
+ color: ${clr(p.theme.alertSuccessColorIcon)};
65
+ `;
66
+
67
+ const errorIconContainerStyles = (p) =>
68
+ p.type === 'error' &&
69
+ css`
70
+ color: ${clr(p.theme.alertErrorColorIcon)};
71
+ `;
72
+
73
+ type IconContainerProps = Pick<AlertProps, 'type'>;
74
+ const IconContainer = styled('i', omitEmotionProps('type'))<IconContainerProps>`
75
+ display: flex;
76
+ align-items: center;
77
+
78
+ margin-right: 0.3em;
79
+ font-size: 1.4em;
80
+
81
+ ${infoIconContainerStyles};
82
+ ${successIconContainerStyles};
83
+ ${errorIconContainerStyles};
84
+ `;
85
+
86
+ const typeIconMap = {
87
+ info: InfoCircle,
88
+ success: CheckCircle,
89
+ error: CloseCircle,
90
+ };
91
+
92
+ /**
93
+ * The component for feedback.
94
+ */
95
+ const Alert = forwardRef<HTMLDivElement, AlertProps>(
96
+ ({ type, size, children, ...rest }, ref) => {
97
+ const Icon = useMemo(() => typeIconMap[type], [type]);
98
+
99
+ return (
100
+ <Container size={size} type={type} role='alert' {...rest} ref={ref}>
101
+ <IconContainer type={type}>
102
+ <Icon />
103
+ </IconContainer>
104
+ <span>{children}</span>
105
+ </Container>
106
+ );
107
+ }
108
+ );
109
+
110
+ Alert.displayName = 'Alert';
111
+
112
+ export default Alert;
@@ -0,0 +1,173 @@
1
+ import styled from '@emotion/styled';
2
+ import { User } from '@os-design/icons';
3
+ import { WithSize, sizeStyles } from '@os-design/styles';
4
+ import { Color, clr, useTheme } from '@os-design/theming';
5
+
6
+ import { omitEmotionProps } from '@os-design/utils';
7
+ import React, { forwardRef, useCallback, useMemo } from 'react';
8
+ import Image, { ImageProps } from '../Image';
9
+
10
+ import nameToInitials from './utils/nameToInitials';
11
+ import strToHue from './utils/strToHue';
12
+
13
+ type JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;
14
+ export interface AvatarProps extends JsxDivProps, WithSize {
15
+ /**
16
+ * Used to render the first letter if the image URL is not specified.
17
+ * @default undefined
18
+ */
19
+ firstName?: string;
20
+ /**
21
+ * Used to render the second letter if the image URL is not specified.
22
+ * @default undefined
23
+ */
24
+ lastName?: string;
25
+ /**
26
+ * The URL of the image.
27
+ * @default undefined
28
+ */
29
+ image?: string;
30
+ /**
31
+ * The props of the image.
32
+ * @default undefined
33
+ */
34
+ imageProps?: Omit<ImageProps, 'url'>;
35
+ /**
36
+ * Whether the user is online.
37
+ * @default false
38
+ */
39
+ online?: boolean;
40
+ }
41
+
42
+ const Container = styled('div', omitEmotionProps('size'))<WithSize>`
43
+ position: relative;
44
+ width: 1em;
45
+ height: 1em;
46
+ min-width: 1em;
47
+ min-height: 1em;
48
+ ${sizeStyles};
49
+ `;
50
+
51
+ interface AvatarContainerProps {
52
+ bgColor: Color;
53
+ }
54
+
55
+ const AvatarContainer = styled(
56
+ 'div',
57
+ omitEmotionProps('bgColor')
58
+ )<AvatarContainerProps>`
59
+ width: 100%;
60
+ height: 100%;
61
+ border-radius: ${(p) => p.theme.borderRadius}em;
62
+
63
+ font-weight: 500;
64
+ line-height: 1;
65
+
66
+ color: hsl(0, 0%, 100%);
67
+ background-color: ${(p) => clr(p.bgColor)};
68
+
69
+ display: flex;
70
+ justify-content: center;
71
+ align-items: center;
72
+
73
+ white-space: nowrap; // To disable multiline text
74
+ overflow: hidden; // To trim the image corners
75
+
76
+ ${sizeStyles};
77
+ `;
78
+
79
+ const UserIcon = styled(User)`
80
+ font-size: 0.6em;
81
+ `;
82
+
83
+ const Initials = styled.div`
84
+ font-size: 0.35em;
85
+ `;
86
+
87
+ const INNER_SIZE = 0.25;
88
+ const OUTER_SIZE = INNER_SIZE * 1.2;
89
+
90
+ const Online = styled.span`
91
+ position: absolute;
92
+ right: -0.05em;
93
+ bottom: -0.05em;
94
+ width: ${OUTER_SIZE}em;
95
+ height: ${OUTER_SIZE}em;
96
+ border-radius: 50%;
97
+ background-color: ${(p) => clr(p.theme.avatarOnlineColorScoop)};
98
+
99
+ &::before {
100
+ content: '';
101
+ position: absolute;
102
+ left: ${(OUTER_SIZE - INNER_SIZE) / 2}em;
103
+ bottom: ${(OUTER_SIZE - INNER_SIZE) / 2}em;
104
+ width: ${INNER_SIZE}em;
105
+ height: ${INNER_SIZE}em;
106
+ border-radius: 50%;
107
+ background-color: ${(p) => clr(p.theme.avatarOnlineColorBg)};
108
+ }
109
+ `;
110
+
111
+ /**
112
+ * Avatar can be used to represent people.
113
+ */
114
+ const Avatar = forwardRef<HTMLDivElement, AvatarProps>(
115
+ (
116
+ {
117
+ firstName,
118
+ lastName,
119
+ image,
120
+ imageProps = {},
121
+ online = false,
122
+ size = '2em',
123
+ ...rest
124
+ },
125
+ ref
126
+ ) => {
127
+ const { theme } = useTheme();
128
+
129
+ const bgColor = useMemo<Color>(() => {
130
+ const parts: string[] = [];
131
+ if (firstName) parts.push(firstName);
132
+ if (lastName) parts.push(lastName);
133
+ if (parts.length > 0) return [strToHue(parts.join(' ')), 30, 60];
134
+ return theme.avatarDefaultColorBg;
135
+ }, [firstName, lastName, theme.avatarDefaultColorBg]);
136
+
137
+ const fullName = useMemo(
138
+ () => [firstName, lastName].filter((i) => i).join(' ') || undefined,
139
+ [firstName, lastName]
140
+ );
141
+
142
+ const renderChildren = useCallback(() => {
143
+ // Render the image if the image property was specified
144
+ if (image) return <Image url={image} cropped {...imageProps} />;
145
+
146
+ // Render the initials of the name if either firstName or lastName was specified
147
+ const initials = nameToInitials({ firstName, lastName });
148
+ if (initials) return <Initials>{initials}</Initials>;
149
+
150
+ // Otherwise render the user icon
151
+ return <UserIcon />;
152
+ }, [image, imageProps, firstName, lastName]);
153
+
154
+ return (
155
+ <Container size={size}>
156
+ <AvatarContainer
157
+ bgColor={bgColor}
158
+ role='img'
159
+ aria-label={fullName || 'User'}
160
+ {...rest}
161
+ ref={ref}
162
+ >
163
+ {renderChildren()}
164
+ </AvatarContainer>
165
+ {online && <Online />}
166
+ </Container>
167
+ );
168
+ }
169
+ );
170
+
171
+ Avatar.displayName = 'Avatar';
172
+
173
+ export default Avatar;
@@ -0,0 +1,12 @@
1
+ interface Name {
2
+ firstName?: string;
3
+ lastName?: string;
4
+ }
5
+
6
+ const nameToInitials = ({ firstName, lastName }: Name): string => {
7
+ const first = firstName ? firstName.charAt(0) : '';
8
+ const second = lastName ? lastName.charAt(0) : '';
9
+ return `${first}${second}`.toUpperCase();
10
+ };
11
+
12
+ export default nameToInitials;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Return the hue of the color by string.
3
+ */
4
+ const strToHue = (str: string): number => {
5
+ let hash = 0;
6
+ for (let i = 0; i < str.length; i += 1) {
7
+ // eslint-disable-next-line no-bitwise
8
+ hash = str.charCodeAt(i) + ((hash << 5) - hash);
9
+ }
10
+ return hash % 360;
11
+ };
12
+
13
+ export default strToHue;
@@ -0,0 +1,29 @@
1
+ import styled from '@emotion/styled';
2
+
3
+ import { sizeStyles, WithSize } from '@os-design/styles';
4
+ import { omitEmotionProps } from '@os-design/utils';
5
+ import React, { forwardRef } from 'react';
6
+
7
+ import Skeleton from '../Skeleton';
8
+
9
+ type JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;
10
+ export type AvatarSkeletonProps = JsxDivProps & WithSize;
11
+
12
+ const Container = styled('div', omitEmotionProps('size'))<WithSize>`
13
+ ${sizeStyles};
14
+ `;
15
+
16
+ /**
17
+ * Provides an avatar placeholder while a user waits for the content to load.
18
+ */
19
+ const AvatarSkeleton = forwardRef<HTMLDivElement, AvatarSkeletonProps>(
20
+ ({ size = '2em', ...rest }, ref) => (
21
+ <Container size={size} {...rest} ref={ref}>
22
+ <Skeleton width='1em' />
23
+ </Container>
24
+ )
25
+ );
26
+
27
+ AvatarSkeleton.displayName = 'AvatarSkeleton';
28
+
29
+ export default AvatarSkeleton;
@@ -0,0 +1,93 @@
1
+ import styled from '@emotion/styled';
2
+ import { enableScrollingStyles, sizeStyles, WithSize } from '@os-design/styles';
3
+ import { clr } from '@os-design/theming';
4
+ import { omitEmotionProps } from '@os-design/utils';
5
+ import React, { forwardRef, ReactElement, useMemo } from 'react';
6
+ import BreadcrumbItem from '../BreadcrumbItem';
7
+
8
+ type JsxOlProps = Omit<JSX.IntrinsicElements['ol'], 'ref'>;
9
+ export interface BreadcrumbProps extends JsxOlProps, WithSize {
10
+ 'aria-label'?: string;
11
+ }
12
+
13
+ const Container = styled('ol', omitEmotionProps('size'))<WithSize>`
14
+ list-style: none;
15
+ margin: 0;
16
+ padding: 0;
17
+ display: flex;
18
+ align-items: center;
19
+ color: ${(p) => clr(p.theme.colorText)};
20
+
21
+ ${enableScrollingStyles('x', false)};
22
+ ${sizeStyles};
23
+ `;
24
+
25
+ let childIndex = 0;
26
+
27
+ /**
28
+ * Displays the current location within the hierarchical structure.
29
+ * Implements the Schema.org markup for breadcrumbs.
30
+ * See https://schema.org/BreadcrumbList
31
+ */
32
+ const Breadcrumb = forwardRef<HTMLOListElement, BreadcrumbProps>(
33
+ ({ 'aria-label': ariaLabel = 'Breadcrumb', children, ...rest }, ref) => {
34
+ const breadcrumbItems = useMemo(() => {
35
+ const items: ReactElement[] = [];
36
+ const childrenArray = React.Children.toArray(children);
37
+ childrenArray.forEach((child, index) => {
38
+ if (!React.isValidElement(child)) return;
39
+
40
+ let element;
41
+ const breadcrumbItemProps = {
42
+ key: childIndex,
43
+ position: index + 1,
44
+ hasRightArrow: index < childrenArray.length - 1,
45
+ };
46
+
47
+ if (child.type === BreadcrumbItem) {
48
+ element = React.cloneElement(child, breadcrumbItemProps);
49
+ } else if (
50
+ React.isValidElement(child.props.children) &&
51
+ child.props.children.type === BreadcrumbItem
52
+ ) {
53
+ const breadcrumbItem = React.cloneElement(
54
+ child.props.children,
55
+ breadcrumbItemProps
56
+ );
57
+ element = React.cloneElement(
58
+ child,
59
+ {
60
+ ...(child.props || {}),
61
+ key: childIndex,
62
+ },
63
+ breadcrumbItem
64
+ );
65
+ }
66
+ if (!element) return;
67
+
68
+ items.push(element);
69
+ childIndex += 1;
70
+ });
71
+ return items;
72
+ }, [children]);
73
+
74
+ if (breadcrumbItems.length === 0) return null;
75
+
76
+ return (
77
+ <nav aria-label={ariaLabel}>
78
+ <Container
79
+ itemScope
80
+ itemType='https://schema.org/BreadcrumbList'
81
+ {...rest}
82
+ ref={ref}
83
+ >
84
+ {breadcrumbItems}
85
+ </Container>
86
+ </nav>
87
+ );
88
+ }
89
+ );
90
+
91
+ Breadcrumb.displayName = 'Breadcrumb';
92
+
93
+ export default Breadcrumb;