@edvisor/product-language 0.1.1 → 0.3.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.
- package/.babelrc +12 -0
- package/.eslintrc.json +147 -0
- package/.storybook/main.js +57 -0
- package/.storybook/manager.js +7 -0
- package/.storybook/preview.js +15 -0
- package/.storybook/tsconfig.json +30 -0
- package/jest.config.ts +15 -0
- package/jest.setup.ts +2 -0
- package/package.json +21 -10
- package/project.json +96 -0
- package/src/README.md +61 -0
- package/src/assets/svg/example_icon.svg +3 -0
- package/src/assets/svg/example_icon_white.svg +3 -0
- package/src/assets/svg/spinner.svg +3 -0
- package/src/assets/svg/spinner_white.svg +3 -0
- package/src/helpers/index.ts +4 -0
- package/src/helpers/playground.ts +16 -0
- package/src/helpers/talesOf.tsx +42 -0
- package/src/index.ts +2 -0
- package/src/lib/components/README.md +49 -0
- package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
- package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
- package/src/lib/components/alert-banner/index.ts +1 -0
- package/src/lib/components/badge/badge-type-flags.ts +72 -0
- package/src/lib/components/badge/badge.test.tsx +29 -0
- package/src/lib/components/badge/badge.tsx +22 -0
- package/src/lib/components/badge/index.ts +1 -0
- package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
- package/src/lib/components/badge/stories/components.tsx +49 -0
- package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +17 -7
- package/src/lib/components/card/atoms/index.ts +1 -0
- package/src/lib/components/card/card.test.tsx +162 -0
- package/src/lib/components/card/card.tsx +78 -0
- package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
- package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
- package/src/lib/components/card/components/card-section-slot.tsx +51 -0
- package/src/lib/components/card/components/index.ts +3 -0
- package/src/lib/components/card/index.ts +2 -0
- package/src/lib/components/card/molecules/index.ts +1 -0
- package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
- package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
- package/src/lib/components/card/storybook/card.stories.mdx +100 -0
- package/src/lib/components/card/storybook/components.tsx +223 -0
- package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
- package/src/lib/components/checkbox/checkbox.tsx +63 -0
- package/src/lib/components/checkbox/helpers.tsx +100 -0
- package/src/lib/components/checkbox/index.tsx +1 -0
- package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
- package/src/lib/components/checkbox/stories/components.tsx +84 -0
- package/src/lib/components/divider/divider-type-flags.tsx +37 -0
- package/src/lib/components/divider/divider.test.tsx +34 -0
- package/src/lib/components/divider/divider.tsx +37 -0
- package/src/lib/components/divider/index.tsx +1 -0
- package/src/lib/components/divider/stories/components.tsx +13 -0
- package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
- package/src/lib/components/flag/flag-size-flags.tsx +55 -0
- package/src/lib/components/flag/flag.list.tsx +788 -0
- package/src/lib/components/flag/flag.test.tsx +65 -0
- package/src/lib/components/flag/flag.tsx +97 -0
- package/src/lib/components/flag/index.tsx +1 -0
- package/src/lib/components/flag/stories/components.tsx +403 -0
- package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
- package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
- package/src/lib/components/icon/icon-list.tsx +135 -0
- package/src/lib/components/icon/icon.test.tsx +48 -0
- package/src/lib/components/icon/icon.tsx +181 -0
- package/src/lib/components/icon/index.tsx +1 -0
- package/src/lib/components/icon/stories/components.tsx +282 -0
- package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
- package/src/lib/components/index.ts +19 -0
- package/src/lib/components/input-field/components/index.ts +2 -0
- package/src/lib/components/input-field/components/labeled-input.tsx +54 -0
- package/src/lib/components/input-field/components/stepper.tsx +60 -0
- package/src/lib/components/input-field/index.ts +6 -0
- package/src/lib/components/input-field/input-field.test.tsx +107 -0
- package/src/lib/components/input-field/input-field.tsx +126 -0
- package/src/lib/components/input-field/input-number.tsx +41 -0
- package/src/lib/components/input-field/input-text.tsx +30 -0
- package/src/lib/components/input-field/storybook/components.tsx +327 -0
- package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
- package/src/lib/components/layout/flex.tsx +22 -0
- package/src/lib/components/layout/grid-layout.tsx +40 -0
- package/src/lib/components/layout/index.ts +3 -0
- package/src/lib/components/layout/left-right-layout.tsx +67 -0
- package/src/lib/components/link/index.ts +1 -0
- package/src/lib/components/link/link.test.tsx +29 -0
- package/src/lib/components/link/link.tsx +56 -0
- package/src/lib/components/link/storybook/link.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
- package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
- package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
- package/src/lib/components/molecules/avatar/index.tsx +1 -0
- package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
- package/src/lib/components/molecules/button/button-flags.tsx +340 -0
- package/src/lib/components/molecules/button/button.test.tsx +77 -0
- package/src/lib/components/molecules/button/button.tsx +214 -0
- package/src/lib/components/molecules/button/index.tsx +1 -0
- package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
- package/src/lib/components/molecules/button/stories/components.tsx +84 -0
- package/src/lib/components/molecules/index.ts +3 -0
- package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +49 -0
- package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
- package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
- package/src/lib/components/organisms/index.ts +1 -0
- package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +52 -0
- package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
- package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
- package/src/lib/components/spinner/index.tsx +1 -0
- package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
- package/src/lib/components/spinner/spinner.test.tsx +31 -0
- package/src/lib/components/spinner/spinner.tsx +54 -0
- package/src/lib/components/spinner/stories/components.tsx +39 -0
- package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
- package/src/lib/components/tabs/components/index.ts +1 -0
- package/src/lib/components/tabs/components/tab.tsx +62 -0
- package/src/lib/components/tabs/index.tsx +1 -0
- package/src/lib/components/tabs/storybook/components.tsx +282 -0
- package/src/lib/components/tabs/storybook/tabs.stories.mdx +97 -0
- package/src/lib/components/tabs/tabs.test.tsx +86 -0
- package/src/lib/components/tabs/tabs.tsx +101 -0
- package/src/lib/components/tag/components/close-button.tsx +85 -0
- package/src/lib/components/tag/components/index.ts +2 -0
- package/src/lib/components/tag/components/tag-label.tsx +44 -0
- package/src/lib/components/tag/index.tsx +1 -0
- package/src/lib/components/tag/stories/components.tsx +86 -0
- package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
- package/src/lib/components/tag/tag.test.tsx +36 -0
- package/src/lib/components/tag/tag.tsx +33 -0
- package/src/lib/components/thumbnail/index.tsx +1 -0
- package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +34 -0
- package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
- package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
- package/src/lib/components/thumbnail/thumbnail.tsx +45 -0
- package/src/lib/components/typography/index.ts +1 -0
- package/src/lib/components/typography/storybook/components.tsx +288 -0
- package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
- package/src/lib/components/typography/typography.test.tsx +97 -0
- package/src/lib/components/typography/typography.tsx +99 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
- package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
- package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
- package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
- package/src/lib/foundations/color-system/components/index.ts +1 -0
- package/src/lib/foundations/color-system/index.ts +1 -0
- package/src/lib/foundations/index.ts +4 -0
- package/src/lib/foundations/shadows/components.tsx +59 -0
- package/src/lib/foundations/shadows/index.ts +1 -0
- package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
- package/src/lib/foundations/shadows/shadows.tsx +47 -0
- package/src/lib/foundations/spacing/index.ts +1 -0
- package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
- package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
- package/src/lib/foundations/spacing/spacing.ts +18 -0
- package/src/lib/foundations/typography/constants.ts +25 -0
- package/src/lib/foundations/typography/fonts.ts +205 -0
- package/src/lib/foundations/typography/index.tsx +1 -0
- package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
- package/src/lib/foundations/typography/typography.tsx +102 -0
- package/src/lib/helpers/generic-types.ts +44 -0
- package/src/lib/helpers/index.ts +6 -0
- package/src/lib/helpers/nothing.tsx +18 -0
- package/src/lib/helpers/numbers.ts +67 -0
- package/src/lib/helpers/safe-navigation.ts +44 -0
- package/src/lib/helpers/slots.test.tsx +98 -0
- package/src/lib/helpers/slots.tsx +157 -0
- package/src/lib/helpers/strings.test.ts +47 -0
- package/src/lib/helpers/strings.ts +16 -0
- package/tsconfig.json +35 -0
- package/tsconfig.lib.json +28 -0
- package/tsconfig.spec.json +21 -0
- package/index.d.ts +0 -2
- package/index.js +0 -6078
- package/lib/components/alert-banner/alert-banner.d.ts +0 -11
- package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
- package/lib/components/alert-banner/index.d.ts +0 -1
- package/lib/components/badge/badge-type-flags.d.ts +0 -18
- package/lib/components/badge/badge.d.ts +0 -5
- package/lib/components/badge/index.d.ts +0 -1
- package/lib/components/card/atoms/index.d.ts +0 -1
- package/lib/components/card/card.d.ts +0 -14
- package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -5
- package/lib/components/card/components/card-controls-slot.d.ts +0 -4
- package/lib/components/card/components/card-section-slot.d.ts +0 -11
- package/lib/components/card/components/index.d.ts +0 -3
- package/lib/components/card/index.d.ts +0 -2
- package/lib/components/card/molecules/index.d.ts +0 -1
- package/lib/components/card/molecules/left-right-card.d.ts +0 -16
- package/lib/components/checkbox/checkbox.d.ts +0 -11
- package/lib/components/checkbox/components/components.d.ts +0 -12
- package/lib/components/checkbox/index.d.ts +0 -1
- package/lib/components/divider/divider-type-flags.d.ts +0 -9
- package/lib/components/divider/divider.d.ts +0 -7
- package/lib/components/divider/index.d.ts +0 -1
- package/lib/components/index.d.ts +0 -12
- package/lib/components/input-field/components/index.d.ts +0 -2
- package/lib/components/input-field/components/labeled-input.d.ts +0 -11
- package/lib/components/input-field/components/stepper.d.ts +0 -7
- package/lib/components/input-field/index.d.ts +0 -3
- package/lib/components/input-field/input-field.d.ts +0 -25
- package/lib/components/input-field/input-number.d.ts +0 -18
- package/lib/components/input-field/input-text.d.ts +0 -14
- package/lib/components/layout/flex.d.ts +0 -16
- package/lib/components/layout/grid-layout.d.ts +0 -11
- package/lib/components/layout/index.d.ts +0 -3
- package/lib/components/layout/left-right-layout.d.ts +0 -70
- package/lib/components/link/index.d.ts +0 -1
- package/lib/components/link/link.d.ts +0 -14
- package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
- package/lib/components/molecules/avatar/avatar.d.ts +0 -12
- package/lib/components/molecules/avatar/index.d.ts +0 -1
- package/lib/components/molecules/button/button-flags.d.ts +0 -39
- package/lib/components/molecules/button/button.d.ts +0 -24
- package/lib/components/molecules/button/index.d.ts +0 -1
- package/lib/components/molecules/index.d.ts +0 -3
- package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
- package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
- package/lib/components/organisms/index.d.ts +0 -1
- package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
- package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
- package/lib/components/spinner/index.d.ts +0 -1
- package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
- package/lib/components/spinner/spinner.d.ts +0 -9
- package/lib/components/thumbnail/index.d.ts +0 -1
- package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
- package/lib/components/thumbnail/thumbnail.d.ts +0 -9
- package/lib/components/typography/index.d.ts +0 -1
- package/lib/components/typography/typography.d.ts +0 -23
- package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -77
- package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
- package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -131
- package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
- package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
- package/lib/foundations/color-system/components/index.d.ts +0 -1
- package/lib/foundations/color-system/index.d.ts +0 -1
- package/lib/foundations/index.d.ts +0 -4
- package/lib/foundations/shadows/components.d.ts +0 -8
- package/lib/foundations/shadows/index.d.ts +0 -1
- package/lib/foundations/shadows/shadows.d.ts +0 -8
- package/lib/foundations/spacing/index.d.ts +0 -1
- package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
- package/lib/foundations/spacing/spacing.d.ts +0 -18
- package/lib/foundations/typography/constants.d.ts +0 -22
- package/lib/foundations/typography/index.d.ts +0 -1
- package/lib/foundations/typography/text-aspect-flags.d.ts +0 -14
- package/lib/foundations/typography/typography.d.ts +0 -19
- package/lib/helpers/generic-types.d.ts +0 -21
- package/lib/helpers/index.d.ts +0 -6
- package/lib/helpers/nothing.d.ts +0 -8
- package/lib/helpers/numbers.d.ts +0 -41
- package/lib/helpers/safe-navigation.d.ts +0 -14
- package/lib/helpers/slots.d.ts +0 -8
- package/lib/helpers/strings.d.ts +0 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import styled from 'styled-components'
|
|
2
|
+
import { FC } from './generic-types'
|
|
3
|
+
import { isReactElementOfType, Slot } from './slots'
|
|
4
|
+
|
|
5
|
+
describe('isReactElementOfType', () => {
|
|
6
|
+
describe('class component', () => {
|
|
7
|
+
class Bob extends Slot {}
|
|
8
|
+
|
|
9
|
+
describe('both component and element are unstyled', () => {
|
|
10
|
+
it('knows when they are different', () => {
|
|
11
|
+
expect(isReactElementOfType(Bob)(<div />)).toBe(false)
|
|
12
|
+
})
|
|
13
|
+
it('knows when they are the same', () => {
|
|
14
|
+
expect(isReactElementOfType(Bob)(<Bob />)).toBe(true)
|
|
15
|
+
})
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
describe('component type is styled', () => {
|
|
19
|
+
const StyledBob = styled(Bob)``
|
|
20
|
+
|
|
21
|
+
it('knows when they are different', () => {
|
|
22
|
+
expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
|
|
23
|
+
})
|
|
24
|
+
it('knows when they are the same', () => {
|
|
25
|
+
expect(isReactElementOfType(StyledBob)(<Bob />)).toBe(true)
|
|
26
|
+
})
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
describe('element is styled', () => {
|
|
30
|
+
const StyledBob = styled(Bob)``
|
|
31
|
+
|
|
32
|
+
it('knows when they are different', () => {
|
|
33
|
+
expect(isReactElementOfType(Bob)(<div />)).toBe(false)
|
|
34
|
+
})
|
|
35
|
+
it('knows when they are the same', () => {
|
|
36
|
+
expect(isReactElementOfType(Bob)(<StyledBob />)).toBe(true)
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
describe('both component and element are styled', () => {
|
|
41
|
+
const StyledBob = styled(Bob)``
|
|
42
|
+
|
|
43
|
+
it('knows when they are different', () => {
|
|
44
|
+
expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
|
|
45
|
+
})
|
|
46
|
+
it('knows when they are the same', () => {
|
|
47
|
+
expect(isReactElementOfType(StyledBob)(<StyledBob />)).toBe(true)
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe('function component', () => {
|
|
53
|
+
const Bob: FC = () => <div />
|
|
54
|
+
|
|
55
|
+
describe('both component and element are unstyled', () => {
|
|
56
|
+
it('knows when they are different', () => {
|
|
57
|
+
expect(isReactElementOfType(Bob)(<div />)).toBe(false)
|
|
58
|
+
})
|
|
59
|
+
it('knows when they are the same', () => {
|
|
60
|
+
expect(isReactElementOfType(Bob)(<Bob />)).toBe(true)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
describe('component type is styled', () => {
|
|
65
|
+
const StyledBob = styled(Bob)``
|
|
66
|
+
|
|
67
|
+
it('knows when they are different', () => {
|
|
68
|
+
expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
|
|
69
|
+
})
|
|
70
|
+
it('knows when they are the same', () => {
|
|
71
|
+
expect(isReactElementOfType(StyledBob)(<Bob />)).toBe(true)
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
describe('element is styled', () => {
|
|
76
|
+
const StyledBob = styled(Bob)``
|
|
77
|
+
|
|
78
|
+
it('knows when they are different', () => {
|
|
79
|
+
expect(isReactElementOfType(Bob)(<div />)).toBe(false)
|
|
80
|
+
})
|
|
81
|
+
it('knows when they are the same', () => {
|
|
82
|
+
expect(isReactElementOfType(Bob)(<StyledBob />)).toBe(true)
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
describe('both component and element are styled', () => {
|
|
87
|
+
const StyledBob = styled(Bob)``
|
|
88
|
+
|
|
89
|
+
it('knows when they are different', () => {
|
|
90
|
+
expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
|
|
91
|
+
})
|
|
92
|
+
it('knows when they are the same', () => {
|
|
93
|
+
expect(isReactElementOfType(StyledBob)(<StyledBob />)).toBe(true)
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
})
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Children, CSSProperties, PureComponent, ReactElement, ReactNode } from 'react'
|
|
2
|
+
import { StyledComponent } from 'styled-components'
|
|
3
|
+
import { FC, PropsWithChildren } from './generic-types'
|
|
4
|
+
import { Nothing } from './nothing'
|
|
5
|
+
import { isDefined, isNil } from './safe-navigation'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @TODO these aren't quiiiiite right
|
|
9
|
+
*
|
|
10
|
+
* They all say they return ReactNode but I feel like JSX.Element or something
|
|
11
|
+
* is more accurate? The child type needs to include _anything react can render_
|
|
12
|
+
* but it should also allow the caller to cloneElement on the results so that
|
|
13
|
+
* they can do stuff like
|
|
14
|
+
*
|
|
15
|
+
* const sections = getSlots(Section, children)
|
|
16
|
+
* .map((el, i) => i === 0 ? cloneElement(el, { first: true }) : el)
|
|
17
|
+
*
|
|
18
|
+
* Right? I want this...
|
|
19
|
+
* */
|
|
20
|
+
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
function isReactElement (obj?: any): obj is ReactElement {
|
|
23
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
24
|
+
return isDefined(obj) && obj.hasOwnProperty('type')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const isReactElementOfType =
|
|
28
|
+
<P extends PropsWithChildren>(
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
|
|
30
|
+
component: (StyledComponent<FC<P>, any> | FC<P> | typeof Slot) & {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
|
|
32
|
+
target?: any
|
|
33
|
+
}
|
|
34
|
+
) =>
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
|
|
36
|
+
(element?: any): element is ReactElement<P> => {
|
|
37
|
+
/**
|
|
38
|
+
* I'm going to leave this as a big if/else instead of a compound expression to make
|
|
39
|
+
* it clear exactly what we are checking.
|
|
40
|
+
*/
|
|
41
|
+
if (element?.type === component) {
|
|
42
|
+
// component is a function or a class, and element is an element of that type
|
|
43
|
+
return true
|
|
44
|
+
} else if (element?.type?.target === component) {
|
|
45
|
+
// element is a styled element of the given component
|
|
46
|
+
// so we have to look at what it is styling (its target)
|
|
47
|
+
return true
|
|
48
|
+
} else if (isDefined(component?.target) && element?.type === component?.target) {
|
|
49
|
+
// component is the type of a styled component
|
|
50
|
+
// and element is an element of the original unstyled component,
|
|
51
|
+
// so we have to look at the target of the component itself (what it styled)
|
|
52
|
+
return true
|
|
53
|
+
} else if (
|
|
54
|
+
isDefined(component?.target) &&
|
|
55
|
+
element?.type?.target === component?.target
|
|
56
|
+
) {
|
|
57
|
+
// element and component are both styled, possibly _differently_
|
|
58
|
+
// but their underlying component type is the same
|
|
59
|
+
return true
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
export const isSlotOfType = <T extends typeof Slot>(type: T | FC) => (obj?: any): obj is T => {
|
|
67
|
+
return (
|
|
68
|
+
(isDefined(obj) &&
|
|
69
|
+
isReactElement(obj) &&
|
|
70
|
+
isDefined(obj.type) &&
|
|
71
|
+
(Object.getPrototypeOf(obj.type) === type || obj.type === type)) ||
|
|
72
|
+
(isDefined(obj.type) &&
|
|
73
|
+
isDefined(obj.type.target) &&
|
|
74
|
+
(Object.getPrototypeOf(obj.type.target) === type ||
|
|
75
|
+
obj.type.target === type))
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const findSlotByType = <T extends typeof Slot>(type: T, children?: ReactNode): ReactElement => {
|
|
80
|
+
return Children.toArray(children).find(isSlotOfType(type)) as ReactElement
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const filterSlotByType = <T extends typeof Slot>(type: T, children?: ReactNode): ReactElement[] => {
|
|
84
|
+
return Children.toArray(children).filter(isSlotOfType(type)) as ReactElement[]
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export class Slot<T = unknown> extends PureComponent<PropsWithChildren<T>> {
|
|
88
|
+
override render () {
|
|
89
|
+
return this.props.children
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export class StylableSlot extends Slot {
|
|
94
|
+
override render () {
|
|
95
|
+
return <div {...this.props}>{this.props.children}</div>
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** gets children that are _not_ slots */
|
|
100
|
+
export function getOtherChildren(children?: ReactNode): ReactNode[] {
|
|
101
|
+
return Children.toArray(children).filter((child) => !isSlotOfType(Slot)(child))
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function getSlots<T extends typeof Slot>(slot: T, children?: ReactNode): ReactElement[] {
|
|
105
|
+
const result = filterSlotByType(slot, children)
|
|
106
|
+
|
|
107
|
+
if (isNil(result)) {
|
|
108
|
+
return []
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return result
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
|
+
function hasProps (obj: any): obj is { props: { children: ReactNode }} {
|
|
116
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
117
|
+
return isDefined(obj) && obj.hasOwnProperty('props')
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function getSlot<T extends typeof Slot>(slot: T, children?: ReactNode): ReactElement {
|
|
121
|
+
const result = findSlotByType(slot, children)
|
|
122
|
+
|
|
123
|
+
if (isNil(result)) {
|
|
124
|
+
return <Nothing />
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (hasProps(result)) {
|
|
128
|
+
return result
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return result
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** given a ReactElement, like a child, apply the given props to it */
|
|
135
|
+
export function applyProps<T>(element: ReactElement<T>, props: Partial<T>): ReactElement {
|
|
136
|
+
return {
|
|
137
|
+
...element,
|
|
138
|
+
props: {
|
|
139
|
+
...element.props,
|
|
140
|
+
...props,
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** given a ReactElement, like a child, apply the given styles to it, merging with the existing styles */
|
|
146
|
+
export function applyStyle(element: ReactElement, style: CSSProperties): ReactElement {
|
|
147
|
+
return {
|
|
148
|
+
...element,
|
|
149
|
+
props: {
|
|
150
|
+
...element.props,
|
|
151
|
+
style: {
|
|
152
|
+
...element.props.style,
|
|
153
|
+
...style,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { toKebabCase } from './strings'
|
|
2
|
+
|
|
3
|
+
describe('strings', () => {
|
|
4
|
+
describe('toKebabCase', () => {
|
|
5
|
+
it('sends camel case to kebab case', () => {
|
|
6
|
+
const result = toKebabCase('helloMyFriends')
|
|
7
|
+
|
|
8
|
+
expect(result).toBe('hello-my-friends')
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('sends leading caps to kebab case', () => {
|
|
12
|
+
const result = toKebabCase('HelloMyFriends')
|
|
13
|
+
|
|
14
|
+
expect(result).toBe('hello-my-friends')
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it('respects numbers', () => {
|
|
18
|
+
const result = toKebabCase('Section1IsGood')
|
|
19
|
+
|
|
20
|
+
expect(result).toBe('section-1-is-good')
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('respects leading and trailing numbers', () => {
|
|
24
|
+
const result = toKebabCase('1Section1')
|
|
25
|
+
|
|
26
|
+
expect(result).toBe('1-section-1')
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
it('removes non-alphanumeric characters, such as whitespace and punctuation', () => {
|
|
30
|
+
const result = toKebabCase('Help Text. Lorem Ipsum')
|
|
31
|
+
|
|
32
|
+
expect(result).toBe('help-text-lorem-ipsum')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('removes leading and trailing nonsense', () => {
|
|
36
|
+
const result = toKebabCase('__Foo_Bar__')
|
|
37
|
+
|
|
38
|
+
expect(result).toBe('foo-bar')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('removes leading and trailing whitespace', () => {
|
|
42
|
+
const result = toKebabCase(' . Foo_Bar_ _ . ')
|
|
43
|
+
|
|
44
|
+
expect(result).toBe('foo-bar')
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { isDefined } from './safe-navigation'
|
|
2
|
+
|
|
3
|
+
export const toKebabCase = (str: string) => {
|
|
4
|
+
return isDefined(str)
|
|
5
|
+
? str
|
|
6
|
+
.replace(/[^a-zA-Z0-9\\-]/g, ' ')
|
|
7
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
8
|
+
.replace(/([0-9]+)(.*)/g, '$1-$2')
|
|
9
|
+
.replace(/(.*)([0-9]+)/g, '$1-$2')
|
|
10
|
+
.replace(/^[\s_]+/g, '')
|
|
11
|
+
.replace(/[\s_]+$/g, '')
|
|
12
|
+
.replace(/[\s_]+/g, '-')
|
|
13
|
+
.replace(/[^a-zA-Z0-9\\-]/g, '')
|
|
14
|
+
.toLowerCase()
|
|
15
|
+
: ''
|
|
16
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"jsx": "react-jsx",
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"allowSyntheticDefaultImports": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"noImplicitOverride": true,
|
|
11
|
+
"noPropertyAccessFromIndexSignature": true,
|
|
12
|
+
"noImplicitReturns": true,
|
|
13
|
+
"noFallthroughCasesInSwitch": true,
|
|
14
|
+
"baseUrl": "./src/lib",
|
|
15
|
+
"paths": {
|
|
16
|
+
"@components": ["components/index.ts"],
|
|
17
|
+
"@foundations": ["foundations/index.ts"],
|
|
18
|
+
"@helpers": ["helpers/index.ts"],
|
|
19
|
+
"@stories": ["../helpers/index.ts"],
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
"files": [],
|
|
23
|
+
"include": [],
|
|
24
|
+
"references": [
|
|
25
|
+
{
|
|
26
|
+
"path": "./tsconfig.lib.json"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"path": "./tsconfig.spec.json"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"path": "./.storybook/tsconfig.json"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../dist/out-tsc",
|
|
5
|
+
"types": ["node"]
|
|
6
|
+
},
|
|
7
|
+
"files": [
|
|
8
|
+
"../../node_modules/@nrwl/react/typings/cssmodule.d.ts",
|
|
9
|
+
"../../node_modules/@nrwl/react/typings/image.d.ts"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"jest.config.ts",
|
|
13
|
+
"jest.setup.ts",
|
|
14
|
+
"src/helpers/**",
|
|
15
|
+
"**/storybook/**",
|
|
16
|
+
"**/stories/**",
|
|
17
|
+
"**/*.stories.*",
|
|
18
|
+
"**/*.spec.ts",
|
|
19
|
+
"**/*.test.ts",
|
|
20
|
+
"**/*.spec.tsx",
|
|
21
|
+
"**/*.test.tsx",
|
|
22
|
+
"**/*.spec.js",
|
|
23
|
+
"**/*.test.js",
|
|
24
|
+
"**/*.spec.jsx",
|
|
25
|
+
"**/*.test.jsx",
|
|
26
|
+
],
|
|
27
|
+
"include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"]
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "../../dist/out-tsc",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"types": ["jest", "node"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"jest.config.ts",
|
|
10
|
+
"jest.setup.ts",
|
|
11
|
+
"**/*.test.ts",
|
|
12
|
+
"**/*.spec.ts",
|
|
13
|
+
"**/*.test.tsx",
|
|
14
|
+
"**/*.spec.tsx",
|
|
15
|
+
"**/*.test.js",
|
|
16
|
+
"**/*.spec.js",
|
|
17
|
+
"**/*.test.jsx",
|
|
18
|
+
"**/*.spec.jsx",
|
|
19
|
+
"**/*.d.ts"
|
|
20
|
+
]
|
|
21
|
+
}
|
package/index.d.ts
DELETED