@charcoal-ui/react 2.0.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 (64) hide show
  1. package/dist/_lib/compat.d.ts +13 -13
  2. package/dist/_lib/index.d.ts +25 -25
  3. package/dist/components/Button/index.d.ts +21 -21
  4. package/dist/components/Button/index.story.d.ts +35 -35
  5. package/dist/components/Checkbox/index.d.ts +20 -20
  6. package/dist/components/Checkbox/index.story.d.ts +15 -15
  7. package/dist/components/Clickable/index.d.ts +18 -18
  8. package/dist/components/Clickable/index.story.d.ts +8 -8
  9. package/dist/components/DropdownSelector/Listbox.d.ts +9 -9
  10. package/dist/components/DropdownSelector/Popover.d.ts +9 -9
  11. package/dist/components/DropdownSelector/index.d.ts +31 -31
  12. package/dist/components/DropdownSelector/index.story.d.ts +21 -21
  13. package/dist/components/FieldLabel/index.d.ts +10 -10
  14. package/dist/components/Icon/index.d.ts +11 -11
  15. package/dist/components/Icon/index.story.d.ts +23 -23
  16. package/dist/components/IconButton/index.d.ts +13 -13
  17. package/dist/components/IconButton/index.story.d.ts +28 -28
  18. package/dist/components/LoadingSpinner/index.d.ts +14 -14
  19. package/dist/components/LoadingSpinner/index.story.d.ts +9 -9
  20. package/dist/components/Modal/ModalPlumbing.d.ts +4 -4
  21. package/dist/components/Modal/index.d.ts +41 -15
  22. package/dist/components/Modal/index.d.ts.map +1 -1
  23. package/dist/components/Modal/index.story.d.ts +32 -32
  24. package/dist/components/MultiSelect/context.d.ts +13 -13
  25. package/dist/components/MultiSelect/index.d.ts +23 -23
  26. package/dist/components/MultiSelect/index.story.d.ts +74 -74
  27. package/dist/components/MultiSelect/index.test.d.ts +1 -1
  28. package/dist/components/Radio/index.d.ts +23 -23
  29. package/dist/components/Radio/index.story.d.ts +33 -33
  30. package/dist/components/Radio/index.test.d.ts +1 -1
  31. package/dist/components/SegmentedControl/RadioGroupContext.d.ts +8 -8
  32. package/dist/components/SegmentedControl/index.d.ts +19 -19
  33. package/dist/components/SegmentedControl/index.story.d.ts +10 -10
  34. package/dist/components/Switch/index.d.ts +15 -15
  35. package/dist/components/Switch/index.story.d.ts +13 -13
  36. package/dist/components/TagItem/index.d.ts +25 -0
  37. package/dist/components/TagItem/index.d.ts.map +1 -0
  38. package/dist/components/TagItem/index.story.d.ts +26 -0
  39. package/dist/components/TagItem/index.story.d.ts.map +1 -0
  40. package/dist/components/TextField/index.d.ts +43 -43
  41. package/dist/components/TextField/index.story.d.ts +29 -29
  42. package/dist/components/a11y.test.d.ts +1 -1
  43. package/dist/core/ComponentAbstraction.d.ts +23 -23
  44. package/dist/core/OverlayProvider.d.ts +2 -0
  45. package/dist/core/OverlayProvider.d.ts.map +1 -0
  46. package/dist/core/SSRProvider.d.ts +1 -1
  47. package/dist/index.cjs +3334 -3290
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.ts +18 -16
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +4401 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/styled.d.ts +92 -92
  54. package/package.json +17 -15
  55. package/src/components/Modal/index.story.tsx +5 -5
  56. package/src/components/Modal/index.tsx +51 -7
  57. package/src/components/TagItem/index.story.tsx +188 -0
  58. package/src/components/TagItem/index.tsx +176 -0
  59. package/src/core/OverlayProvider.tsx +1 -0
  60. package/src/index.ts +2 -0
  61. package/dist/index.modern.js +0 -4677
  62. package/dist/index.modern.js.map +0 -1
  63. package/dist/index.module.js +0 -4363
  64. package/dist/index.module.js.map +0 -1
@@ -0,0 +1,176 @@
1
+ import React, {
2
+ forwardRef,
3
+ memo,
4
+ useMemo,
5
+ ComponentPropsWithoutRef,
6
+ } from 'react'
7
+ import { useObjectRef } from '@react-aria/utils'
8
+ import styled, { css } from 'styled-components'
9
+ import { theme } from '../../styled'
10
+ import { disabledSelector, px } from '@charcoal-ui/utils'
11
+ import { AriaButtonProps, useButton } from '@react-aria/button'
12
+ import Icon from '../Icon'
13
+
14
+ const sizeMap = {
15
+ S: 32,
16
+ M: 40,
17
+ }
18
+
19
+ export type TagItemProps = {
20
+ label: string
21
+ translatedLabel?: string
22
+ bgColor?: string
23
+ bgImage?: string
24
+ status?: 'default' | 'active' | 'inactive'
25
+ size?: keyof typeof sizeMap
26
+ disabled?: boolean
27
+ } & Pick<ComponentPropsWithoutRef<'a'>, 'href' | 'target' | 'rel' | 'onClick'>
28
+
29
+ const TagItem = forwardRef<HTMLAnchorElement, TagItemProps>(
30
+ function TagItemInner(
31
+ {
32
+ label,
33
+ translatedLabel,
34
+ bgColor = '#7ACCB1',
35
+ bgImage,
36
+ size = 'M',
37
+ disabled,
38
+ status = 'default',
39
+ ...props
40
+ },
41
+ _ref
42
+ ) {
43
+ const ref = useObjectRef(_ref)
44
+ const ariaButtonProps = useMemo<AriaButtonProps<'a'>>(
45
+ () => ({
46
+ elementType: 'a',
47
+ isDisabled: disabled,
48
+ ...props,
49
+ }),
50
+ [disabled, props]
51
+ )
52
+
53
+ const { buttonProps } = useButton(ariaButtonProps, ref)
54
+ const hasTranslatedLabel =
55
+ translatedLabel !== undefined && translatedLabel.length > 0
56
+
57
+ return (
58
+ <TagItemRoot
59
+ ref={ref}
60
+ size={hasTranslatedLabel ? 'M' : size}
61
+ status={status}
62
+ {...buttonProps}
63
+ >
64
+ <Background bgColor={bgColor} bgImage={bgImage} />
65
+
66
+ <Inner>
67
+ <LabelWrapper isTranslate={hasTranslatedLabel}>
68
+ {hasTranslatedLabel && (
69
+ <TranslatedLabel>
70
+ <Label>{translatedLabel}</Label>
71
+ </TranslatedLabel>
72
+ )}
73
+ <Label>{label}</Label>
74
+ </LabelWrapper>
75
+ {status === 'active' && <Icon name="16/Remove" />}
76
+ </Inner>
77
+ </TagItemRoot>
78
+ )
79
+ }
80
+ )
81
+
82
+ export default memo(TagItem)
83
+
84
+ type TagItemRootProps = Pick<TagItemProps, 'status'> &
85
+ Required<Pick<TagItemProps, 'size'>>
86
+
87
+ const TagItemRoot = styled.a<TagItemRootProps>`
88
+ isolation: isolate;
89
+ position: relative;
90
+ height: ${({ size }) => sizeMap[size]}px;
91
+ display: inline-flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ text-decoration: none;
95
+ cursor: pointer;
96
+ overflow: hidden;
97
+
98
+ ${({ size, status }) =>
99
+ theme((o) => [
100
+ o.outline.default.focus,
101
+ o.borderRadius(4),
102
+ status !== 'active' && size === 'M' && o.padding.horizontal(24),
103
+ status !== 'active' && size === 'S' && o.padding.horizontal(16),
104
+ status === 'inactive' && o.bg.surface3,
105
+ status === 'inactive' ? o.font.text2 : o.font.text5,
106
+ ...(status === 'active' ? [o.padding.left(16), o.padding.right(8)] : []),
107
+ ])}
108
+
109
+ ${disabledSelector} {
110
+ ${theme((o) => [o.disabled])}
111
+ cursor: default;
112
+ }
113
+ `
114
+
115
+ const Background = styled.div<Pick<TagItemProps, 'bgColor' | 'bgImage'>>`
116
+ position: absolute;
117
+ z-index: 1;
118
+ top: 0;
119
+ left: 0;
120
+ width: 100%;
121
+ height: 100%;
122
+
123
+ background-color: ${({ bgColor }) => bgColor};
124
+
125
+ ${({ bgImage }) =>
126
+ bgImage !== undefined &&
127
+ css`
128
+ ${theme((o) => [o.bg.surface4])}
129
+ &::before {
130
+ content: '';
131
+ position: absolute;
132
+ top: 0;
133
+ left: 0;
134
+ width: 100%;
135
+ height: 100%;
136
+ background-position: center;
137
+ background-size: cover;
138
+ background-image: url(${bgImage});
139
+ mix-blend-mode: overlay;
140
+ }
141
+ `}
142
+ `
143
+
144
+ const Inner = styled.div`
145
+ display: inline-flex;
146
+ gap: ${({ theme }) => px(theme.spacing[8])};
147
+ align-items: center;
148
+ z-index: 2;
149
+ `
150
+
151
+ const labelCSS = css`
152
+ ${theme((o) => [o.typography(14).bold])}
153
+ `
154
+ const translateLabelCSS = css`
155
+ display: flex;
156
+ align-items: center;
157
+ flex-direction: column;
158
+ font-size: 10px;
159
+ `
160
+ const LabelWrapper = styled.div<{ isTranslate?: boolean }>`
161
+ ${({ isTranslate }) => (isTranslate ?? false ? translateLabelCSS : labelCSS)}
162
+ `
163
+
164
+ const Label = styled.span`
165
+ max-width: 152px;
166
+ overflow: hidden;
167
+ text-overflow: ellipsis;
168
+ white-space: nowrap;
169
+ font-size: inherit;
170
+ color: inherit;
171
+ line-height: inherit;
172
+ `
173
+
174
+ const TranslatedLabel = styled.div`
175
+ ${theme((o) => [o.typography(12).bold])}
176
+ `
@@ -0,0 +1 @@
1
+ export { OverlayProvider } from '@react-aria/overlays'
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@ export {
4
4
  type LinkProps,
5
5
  } from './core/ComponentAbstraction'
6
6
  export { SSRProvider } from './core/SSRProvider'
7
+ export { OverlayProvider } from './core/OverlayProvider'
7
8
  export { default as Button, type ButtonProps } from './components/Button'
8
9
  export {
9
10
  default as Clickable,
@@ -54,3 +55,4 @@ export {
54
55
  type SegmentedControlProps,
55
56
  } from './components/SegmentedControl'
56
57
  export { default as Checkbox } from './components/Checkbox'
58
+ export { default as TagItem, type TagItemProps } from './components/TagItem'