@charcoal-ui/icons 1.0.0-alpha.1
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/LICENSE +201 -0
- package/README.md +90 -0
- package/dist/PixivIcon.d.ts +35 -0
- package/dist/PixivIcon.d.ts.map +1 -0
- package/dist/PixivIcon.story.d.ts +40 -0
- package/dist/PixivIcon.story.d.ts.map +1 -0
- package/dist/PixivIcon.test.d.ts +2 -0
- package/dist/PixivIcon.test.d.ts.map +1 -0
- package/dist/filenames.d.ts +4 -0
- package/dist/filenames.d.ts.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.modern.js +15 -0
- package/dist/index.modern.js.map +1 -0
- package/dist/index.module.js +2 -0
- package/dist/index.module.js.map +1 -0
- package/dist/loaders.d.ts +11 -0
- package/dist/loaders.d.ts.map +1 -0
- package/package.json +41 -0
- package/src/16/TestIconThatNeverExists.svg +1 -0
- package/src/PixivIcon.story.tsx +165 -0
- package/src/PixivIcon.test.tsx +72 -0
- package/src/PixivIcon.ts +202 -0
- package/src/declaration.d.ts +4 -0
- package/src/filenames.ts +10 -0
- package/src/index.ts +22 -0
- package/src/loaders.ts +56 -0
- package/svg/16/Add.svg +1 -0
- package/svg/16/ArrowDown.svg +1 -0
- package/svg/16/Back.svg +1 -0
- package/svg/16/Book.svg +1 -0
- package/svg/16/BookmarkOff.svg +1 -0
- package/svg/16/BookmarkOn.svg +1 -0
- package/svg/16/Check.svg +1 -0
- package/svg/16/Dot.svg +1 -0
- package/svg/16/Error.svg +1 -0
- package/svg/16/Filter.svg +1 -0
- package/svg/16/Info.svg +1 -0
- package/svg/16/Menu.svg +1 -0
- package/svg/16/More.svg +1 -0
- package/svg/16/Pencil.svg +1 -0
- package/svg/16/Remove.svg +1 -0
- package/svg/16/Search.svg +1 -0
- package/svg/16/Speaker.svg +1 -0
- package/svg/24/Add.svg +1 -0
- package/svg/24/AddImage.svg +1 -0
- package/svg/24/AddModel.svg +1 -0
- package/svg/24/AddPeople.svg +1 -0
- package/svg/24/AddRubi.svg +1 -0
- package/svg/24/AddText.svg +1 -0
- package/svg/24/Alart.svg +1 -0
- package/svg/24/Announcement.svg +1 -0
- package/svg/24/Ar.svg +1 -0
- package/svg/24/Archive.svg +1 -0
- package/svg/24/ArrowDown.svg +1 -0
- package/svg/24/ArrowUp.svg +1 -0
- package/svg/24/Binet.svg +1 -0
- package/svg/24/Body.svg +1 -0
- package/svg/24/BodyEdit.svg +1 -0
- package/svg/24/Book.svg +1 -0
- package/svg/24/BringBackward.svg +1 -0
- package/svg/24/BringForward.svg +1 -0
- package/svg/24/Calendar.svg +1 -0
- package/svg/24/Camera.svg +1 -0
- package/svg/24/CameraVideo.svg +1 -0
- package/svg/24/ChangeCharactor.svg +1 -0
- package/svg/24/ChatBot.svg +1 -0
- package/svg/24/Check.svg +1 -0
- package/svg/24/ChromaticAberration.svg +1 -0
- package/svg/24/Close.svg +1 -0
- package/svg/24/Codes.svg +1 -0
- package/svg/24/Collapse.svg +1 -0
- package/svg/24/CommentFill.svg +1 -0
- package/svg/24/CommentOutline.svg +1 -0
- package/svg/24/Contest.svg +1 -0
- package/svg/24/Contrast.svg +1 -0
- package/svg/24/Description.svg +1 -0
- package/svg/24/DeviceRotation.svg +1 -0
- package/svg/24/Discovery.svg +4 -0
- package/svg/24/Dot.svg +1 -0
- package/svg/24/DotAlt.svg +1 -0
- package/svg/24/Down.svg +1 -0
- package/svg/24/DownloadAlt.svg +1 -0
- package/svg/24/Duplicate.svg +1 -0
- package/svg/24/Dust.svg +54 -0
- package/svg/24/Emoji.svg +1 -0
- package/svg/24/Error.svg +1 -0
- package/svg/24/ErrorOctagon.svg +1 -0
- package/svg/24/Events.svg +1 -0
- package/svg/24/Expand.svg +1 -0
- package/svg/24/FaceEdit.svg +1 -0
- package/svg/24/Fashion.svg +1 -0
- package/svg/24/Feed.svg +1 -0
- package/svg/24/File.svg +1 -0
- package/svg/24/Filter.svg +1 -0
- package/svg/24/Flare.svg +1 -0
- package/svg/24/FormatAlignCenter.svg +1 -0
- package/svg/24/FormatAlignLeft.svg +1 -0
- package/svg/24/FormatAlignRight.svg +1 -0
- package/svg/24/FormatColorFill.svg +1 -0
- package/svg/24/FormatColorFillNoColor.svg +1 -0
- package/svg/24/FormatFontFamily.svg +1 -0
- package/svg/24/FormatFontSize.svg +1 -0
- package/svg/24/FormatLetterSpacing.svg +1 -0
- package/svg/24/FormatLineSpacing.svg +1 -0
- package/svg/24/Fov.svg +1 -0
- package/svg/24/FrameEffect.svg +3 -0
- package/svg/24/FrameSize.svg +1 -0
- package/svg/24/Gift.svg +1 -0
- package/svg/24/Glow.svg +1 -0
- package/svg/24/Groups.svg +1 -0
- package/svg/24/HairEdit.svg +1 -0
- package/svg/24/Hashtag.svg +1 -0
- package/svg/24/Hide.svg +1 -0
- package/svg/24/Home.svg +1 -0
- package/svg/24/Hue.svg +1 -0
- package/svg/24/Idea.svg +1 -0
- package/svg/24/Image.svg +1 -0
- package/svg/24/ImageAlt.svg +1 -0
- package/svg/24/ImageHidden.svg +1 -0
- package/svg/24/ImageReplace.svg +1 -0
- package/svg/24/Images.svg +1 -0
- package/svg/24/ImgContain.svg +1 -0
- package/svg/24/ImgCover.svg +1 -0
- package/svg/24/Index.svg +1 -0
- package/svg/24/Info.svg +1 -0
- package/svg/24/Invalid.svg +1 -0
- package/svg/24/Invoice.svg +1 -0
- package/svg/24/ItemRemove.svg +1 -0
- package/svg/24/LatestWorks.svg +1 -0
- package/svg/24/LikeOff.svg +1 -0
- package/svg/24/LikeOn.svg +1 -0
- package/svg/24/Link.svg +1 -0
- package/svg/24/LockLock.svg +1 -0
- package/svg/24/LockUnlock.svg +1 -0
- package/svg/24/Logout.svg +1 -0
- package/svg/24/Manga.svg +1 -0
- package/svg/24/Menu.svg +1 -0
- package/svg/24/Message.svg +1 -0
- package/svg/24/Microphone.svg +1 -0
- package/svg/24/MobilePhone.svg +1 -0
- package/svg/24/Move1.svg +1 -0
- package/svg/24/Next.svg +1 -0
- package/svg/24/Notification.svg +1 -0
- package/svg/24/NotificationOff.svg +1 -0
- package/svg/24/Novels.svg +1 -0
- package/svg/24/OpenInNew.svg +1 -0
- package/svg/24/Options.svg +1 -0
- package/svg/24/OptionsAlt.svg +1 -0
- package/svg/24/Overlay.svg +1 -0
- package/svg/24/Palette.svg +1 -0
- package/svg/24/Pause.svg +5 -0
- package/svg/24/PauseAlt.svg +1 -0
- package/svg/24/Pencil.svg +1 -0
- package/svg/24/PencilDraw.svg +1 -0
- package/svg/24/PencilLive.svg +1 -0
- package/svg/24/PencilText.svg +1 -0
- package/svg/24/Person.svg +1 -0
- package/svg/24/Play.svg +4 -0
- package/svg/24/Pose.svg +1 -0
- package/svg/24/Prev.svg +1 -0
- package/svg/24/Projects.svg +1 -0
- package/svg/24/PullDown.svg +1 -0
- package/svg/24/PullUp.svg +1 -0
- package/svg/24/Question.svg +1 -0
- package/svg/24/QuestionOutline.svg +1 -0
- package/svg/24/Ranking.svg +1 -0
- package/svg/24/Reload.svg +1 -0
- package/svg/24/ReloadLoop.svg +1 -0
- package/svg/24/Reorder.svg +1 -0
- package/svg/24/Roll.svg +1 -0
- package/svg/24/Rotate90DegreesC.svg +1 -0
- package/svg/24/Rotate90DegreesCc.svg +1 -0
- package/svg/24/RotateRight.svg +1 -0
- package/svg/24/Saturation.svg +1 -0
- package/svg/24/Save.svg +1 -0
- package/svg/24/Search.svg +1 -0
- package/svg/24/Send.svg +1 -0
- package/svg/24/Services.svg +1 -0
- package/svg/24/Set.svg +1 -0
- package/svg/24/Settings.svg +1 -0
- package/svg/24/ShareAndroid.svg +1 -0
- package/svg/24/ShareIos.svg +1 -0
- package/svg/24/Shopping.svg +1 -0
- package/svg/24/Show.svg +1 -0
- package/svg/24/ShowOutline.svg +1 -0
- package/svg/24/Shutter.svg +1 -0
- package/svg/24/Star.svg +1 -0
- package/svg/24/Subtract.svg +1 -0
- package/svg/24/Sun.svg +1 -0
- package/svg/24/Temperature.svg +1 -0
- package/svg/24/Text.svg +1 -0
- package/svg/24/Trash.svg +1 -0
- package/svg/24/TrashAlt.svg +1 -0
- package/svg/24/Up.svg +1 -0
- package/svg/24/Upload.svg +1 -0
- package/svg/24/UploadAlt.svg +1 -0
- package/svg/24/Usagi.svg +1 -0
- package/svg/24/UsagiAlt.svg +1 -0
- package/svg/24/Users.svg +1 -0
- package/svg/24/Video.svg +1 -0
- package/svg/24/ViewGrid2Columns.svg +1 -0
- package/svg/24/ViewGrid3Columns.svg +1 -0
- package/svg/24/ViewList.svg +1 -0
- package/svg/24/Warning.svg +1 -0
- package/svg/32/BookmarkOff.svg +1 -0
- package/svg/32/BookmarkOn.svg +1 -0
- package/svg/32/Camera.svg +1 -0
- package/svg/32/Close.svg +1 -0
- package/svg/32/Collapse.svg +1 -0
- package/svg/32/CommentOff.svg +1 -0
- package/svg/32/CommentOn.svg +1 -0
- package/svg/32/Delete.svg +1 -0
- package/svg/32/Dot.svg +1 -0
- package/svg/32/Edit.svg +1 -0
- package/svg/32/Expand.svg +1 -0
- package/svg/32/Gift.svg +1 -0
- package/svg/32/Home.svg +1 -0
- package/svg/32/HorizontalWriting.svg +1 -0
- package/svg/32/Index.svg +1 -0
- package/svg/32/LikeOff.svg +4 -0
- package/svg/32/LikeOn.svg +3 -0
- package/svg/32/LikeOnPrivate.svg +6 -0
- package/svg/32/Message.svg +1 -0
- package/svg/32/Next.svg +1 -0
- package/svg/32/Notification.svg +1 -0
- package/svg/32/NotificationOff.svg +1 -0
- package/svg/32/NovelViewerSettings.svg +1 -0
- package/svg/32/Pan.svg +1 -0
- package/svg/32/Prev.svg +1 -0
- package/svg/32/PullDown.svg +1 -0
- package/svg/32/PullUp.svg +1 -0
- package/svg/32/RollHorizontal.svg +1 -0
- package/svg/32/RollVertical.svg +1 -0
- package/svg/32/SansSerif.svg +1 -0
- package/svg/32/Serif.svg +1 -0
- package/svg/32/ShareAndroid.svg +1 -0
- package/svg/32/ShareIos.svg +1 -0
- package/svg/32/Shopping.svg +1 -0
- package/svg/32/Upload.svg +1 -0
- package/svg/32/User.svg +1 -0
- package/svg/32/VerticalWriting.svg +1 -0
- package/svg/32/ZoomIn.svg +1 -0
- package/svg/Inline/Add.svg +1 -0
- package/svg/Inline/BookmarkOff.svg +5 -0
- package/svg/Inline/BookmarkOn.svg +1 -0
- package/svg/Inline/Breadcrumbs.svg +1 -0
- package/svg/Inline/Check.svg +1 -0
- package/svg/Inline/Comment.svg +1 -0
- package/svg/Inline/ContextMenu.svg +1 -0
- package/svg/Inline/External.svg +1 -0
- package/svg/Inline/Filter.svg +1 -0
- package/svg/Inline/Folder.svg +1 -0
- package/svg/Inline/ImageResponse.svg +1 -0
- package/svg/Inline/Images.svg +1 -0
- package/svg/Inline/Like.svg +1 -0
- package/svg/Inline/LikeOff.svg +1 -0
- package/svg/Inline/List.svg +1 -0
- package/svg/Inline/Location.svg +1 -0
- package/svg/Inline/Lock.svg +1 -0
- package/svg/Inline/More.svg +1 -0
- package/svg/Inline/Nextworks.svg +1 -0
- package/svg/Inline/Pencil.svg +1 -0
- package/svg/Inline/Remove.svg +1 -0
- package/svg/Inline/Smile.svg +1 -0
- package/svg/Inline/SmileOn.svg +1 -0
- package/svg/Inline/Users.svg +1 -0
- package/svg/Inline/View.svg +1 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/// <reference types='@types/webpack-env' />
|
|
2
|
+
|
|
3
|
+
import React from 'react'
|
|
4
|
+
import styled, { createGlobalStyle } from 'styled-components'
|
|
5
|
+
import TestIconThatNeverExists from './16/TestIconThatNeverExists.svg'
|
|
6
|
+
import { Props } from './PixivIcon'
|
|
7
|
+
import { PixivIcon } from '.'
|
|
8
|
+
import { KnownIconFile, KNOWN_ICON_FILES } from './filenames'
|
|
9
|
+
|
|
10
|
+
interface Story<P> {
|
|
11
|
+
(args: P): React.ReactNode
|
|
12
|
+
args?: P
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
PixivIcon.extend({
|
|
16
|
+
// かぶらなそうな名前をつける
|
|
17
|
+
'16/TestIconThatNeverExists': TestIconThatNeverExists,
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
export default {
|
|
21
|
+
title: 'Icons/PixivIcon (<pixiv-icon>)',
|
|
22
|
+
argTypes: {
|
|
23
|
+
color: {
|
|
24
|
+
control: {
|
|
25
|
+
type: 'color',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
name: {
|
|
29
|
+
control: {
|
|
30
|
+
type: 'select',
|
|
31
|
+
options: [...KNOWN_ICON_FILES, '16/TestIconThatNeverExists'],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
scale: {
|
|
35
|
+
control: {
|
|
36
|
+
type: 'select',
|
|
37
|
+
options: [1, 2, 3],
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const groupedIcons = KNOWN_ICON_FILES.reduce<Record<string, KnownIconFile[]>>(
|
|
44
|
+
(map, icon) => {
|
|
45
|
+
const [prefix] = icon.split('/')
|
|
46
|
+
|
|
47
|
+
if (prefix in map) {
|
|
48
|
+
map[prefix].push(icon)
|
|
49
|
+
} else {
|
|
50
|
+
map[prefix] = [icon]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return map
|
|
54
|
+
},
|
|
55
|
+
{}
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
const Global = createGlobalStyle`
|
|
59
|
+
:root {
|
|
60
|
+
font-family: Helvetica, Arial, sans-serif;
|
|
61
|
+
color: rgba(#000, 0.88);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.icon-class {
|
|
65
|
+
transform: rotate(45deg);
|
|
66
|
+
}
|
|
67
|
+
`
|
|
68
|
+
|
|
69
|
+
const Grid = styled.div`
|
|
70
|
+
display: grid;
|
|
71
|
+
gap: 8px;
|
|
72
|
+
grid-template-columns: 1fr 1fr 1fr;
|
|
73
|
+
`
|
|
74
|
+
|
|
75
|
+
const Group = styled.div`
|
|
76
|
+
& + & {
|
|
77
|
+
margin-top: 64px;
|
|
78
|
+
}
|
|
79
|
+
`
|
|
80
|
+
|
|
81
|
+
const IconDef = styled.div<{ color: string }>`
|
|
82
|
+
color: ${({ color }) => color};
|
|
83
|
+
display: inline-flex;
|
|
84
|
+
align-items: center;
|
|
85
|
+
min-height: 32px;
|
|
86
|
+
|
|
87
|
+
pixiv-icon {
|
|
88
|
+
display: block;
|
|
89
|
+
flex-shrink: 0;
|
|
90
|
+
|
|
91
|
+
& + div {
|
|
92
|
+
flex: 1 0;
|
|
93
|
+
margin-left: 8px;
|
|
94
|
+
font-size: 14px;
|
|
95
|
+
line-height: 22px;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
`
|
|
99
|
+
|
|
100
|
+
const Heading = styled.h2`
|
|
101
|
+
font-size: 20px;
|
|
102
|
+
line-height: 28px;
|
|
103
|
+
font-weight: bold;
|
|
104
|
+
margin: 16px 0;
|
|
105
|
+
`
|
|
106
|
+
|
|
107
|
+
const DefaultStory: Story<{
|
|
108
|
+
scale: NonNullable<Props['scale']>
|
|
109
|
+
color: string
|
|
110
|
+
}> = ({ scale, color }) => (
|
|
111
|
+
<>
|
|
112
|
+
{Object.entries(groupedIcons).map(([groupName, icons]) => (
|
|
113
|
+
<Group key={groupName}>
|
|
114
|
+
<Heading>
|
|
115
|
+
{groupName} (scale: {scale})
|
|
116
|
+
</Heading>
|
|
117
|
+
<Grid>
|
|
118
|
+
{icons.map((name) => (
|
|
119
|
+
<IconDef color={color} key={name}>
|
|
120
|
+
<pixiv-icon key={scale} name={name} scale={scale} />
|
|
121
|
+
<div>{name}</div>
|
|
122
|
+
</IconDef>
|
|
123
|
+
))}
|
|
124
|
+
</Grid>
|
|
125
|
+
</Group>
|
|
126
|
+
))}
|
|
127
|
+
<Global />
|
|
128
|
+
</>
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
export const Default = DefaultStory.bind({})
|
|
132
|
+
|
|
133
|
+
Default.args = { scale: 1, color: '#000000' }
|
|
134
|
+
|
|
135
|
+
export const WithAttributes: Story<Props & { color: string }> = ({
|
|
136
|
+
name,
|
|
137
|
+
scale,
|
|
138
|
+
color,
|
|
139
|
+
}) => (
|
|
140
|
+
<>
|
|
141
|
+
<IconDef color={color}>
|
|
142
|
+
<pixiv-icon class="icon-class" name={name} scale={scale} />
|
|
143
|
+
<div>アイコンと文字</div>
|
|
144
|
+
</IconDef>
|
|
145
|
+
<Global />
|
|
146
|
+
</>
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
WithAttributes.args = { name: '16/Add', scale: 1, color: '#000000' }
|
|
150
|
+
|
|
151
|
+
export const WithUnsafe: Story<Props & { color: string }> = ({
|
|
152
|
+
name,
|
|
153
|
+
scale,
|
|
154
|
+
color,
|
|
155
|
+
}) => (
|
|
156
|
+
<>
|
|
157
|
+
<IconDef color={color}>
|
|
158
|
+
<pixiv-icon unsafe-non-guideline-scale="3.75" name={name} scale={scale} />
|
|
159
|
+
アイコンと文字
|
|
160
|
+
</IconDef>
|
|
161
|
+
<Global />
|
|
162
|
+
</>
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
WithUnsafe.args = { name: '16/Add', scale: 1, color: '#000000' }
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// import { loaders } from './loaders'
|
|
2
|
+
import { PixivIcon } from '.'
|
|
3
|
+
|
|
4
|
+
describe('PixivIcon', () => {
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
jest.clearAllMocks()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
let icon: PixivIcon
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
icon = document.createElement('pixiv-icon') as PixivIcon
|
|
12
|
+
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
icon.waitUntilVisible = () => Promise.resolve()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('can createElement()', () => {
|
|
19
|
+
expect(icon).toBeInstanceOf(PixivIcon)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
// describe('loaders', () => {
|
|
23
|
+
// let loadFromRawUrl: jest.SpyInstance
|
|
24
|
+
// let loadFromFile: jest.SpyInstance
|
|
25
|
+
|
|
26
|
+
// beforeEach(() => {
|
|
27
|
+
// window.fetch = jest.fn(() =>
|
|
28
|
+
// Promise.resolve({
|
|
29
|
+
// ok: true,
|
|
30
|
+
// text: () => Promise.resolve('{body}')
|
|
31
|
+
// } as any)
|
|
32
|
+
// )
|
|
33
|
+
|
|
34
|
+
// loadFromRawUrl = jest.spyOn(loaders, 'loadFromRawUrl')
|
|
35
|
+
// loadFromFile = jest.spyOn(loaders, 'loadFromFile')
|
|
36
|
+
// })
|
|
37
|
+
|
|
38
|
+
// describe('loads svg from file', () => {
|
|
39
|
+
// it('works', async () => {
|
|
40
|
+
// icon.setAttribute('name', '16/Add')
|
|
41
|
+
// document.body.appendChild(icon)
|
|
42
|
+
|
|
43
|
+
// await nextTick()
|
|
44
|
+
|
|
45
|
+
// expect(loadFromFile).toHaveBeenNthCalledWith(1, '16/Add')
|
|
46
|
+
// })
|
|
47
|
+
// })
|
|
48
|
+
|
|
49
|
+
// describe('loads svg from url', () => {
|
|
50
|
+
// beforeAll(() => {
|
|
51
|
+
// PixivIcon.extend({
|
|
52
|
+
// '16/Blah': 'https://example.com/blah.svg'
|
|
53
|
+
// })
|
|
54
|
+
// })
|
|
55
|
+
|
|
56
|
+
// it('works', async () => {
|
|
57
|
+
// icon.setAttribute('name', '16/Blah')
|
|
58
|
+
// document.body.appendChild(icon)
|
|
59
|
+
|
|
60
|
+
// await nextTick()
|
|
61
|
+
|
|
62
|
+
// expect(loadFromRawUrl).toHaveBeenNthCalledWith(1, 'https://example.com/blah.svg')
|
|
63
|
+
// })
|
|
64
|
+
// })
|
|
65
|
+
// })
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// function nextTick() {
|
|
69
|
+
// return new Promise(resolve => {
|
|
70
|
+
// process.nextTick(resolve)
|
|
71
|
+
// })
|
|
72
|
+
// }
|
package/src/PixivIcon.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { html, render } from 'lit-html'
|
|
2
|
+
import { unsafeSVG } from 'lit-html/directives/unsafe-svg.js'
|
|
3
|
+
import type React from 'react'
|
|
4
|
+
import { KnownIconFile } from './filenames'
|
|
5
|
+
import { loaders as defaultLoaders, Loader } from './loaders'
|
|
6
|
+
const { loadFromFile, loadFromRawUrl } = defaultLoaders
|
|
7
|
+
|
|
8
|
+
const attributes = ['name', 'scale', 'unsafe-non-guideline-scale'] as const
|
|
9
|
+
|
|
10
|
+
const ROOT_MARGIN = 50
|
|
11
|
+
|
|
12
|
+
export interface KnownIconType extends Record<KnownIconFile, unknown> {}
|
|
13
|
+
|
|
14
|
+
export interface Props
|
|
15
|
+
extends Omit<
|
|
16
|
+
React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>,
|
|
17
|
+
'className'
|
|
18
|
+
> {
|
|
19
|
+
name: keyof KnownIconType
|
|
20
|
+
scale?: 1 | 2 | 3 | '1' | '2' | '3'
|
|
21
|
+
'unsafe-non-guideline-scale'?: number | string
|
|
22
|
+
|
|
23
|
+
// CustomElements は className が使えない。class と書く必要がある
|
|
24
|
+
// https://ja.reactjs.org/docs/web-components.html#using-web-components-in-react
|
|
25
|
+
class?: string
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const loaders = new Map<string, Loader>()
|
|
29
|
+
|
|
30
|
+
type ExtendedIconFile = Exclude<keyof KnownIconType, KnownIconFile>
|
|
31
|
+
type Extended = [ExtendedIconFile] extends [never] // NOTE: ExtendedIconFileがneverならKnownIconTypeは拡張されていない
|
|
32
|
+
? false
|
|
33
|
+
: true
|
|
34
|
+
|
|
35
|
+
export class PixivIcon extends HTMLElement {
|
|
36
|
+
static readonly tagName = 'pixiv-icon'
|
|
37
|
+
|
|
38
|
+
static extend(
|
|
39
|
+
map: Extended extends true
|
|
40
|
+
? Record<ExtendedIconFile, string>
|
|
41
|
+
: Record<string, string>
|
|
42
|
+
) {
|
|
43
|
+
Object.entries(map).forEach(([name, url]) => {
|
|
44
|
+
if (!name.includes('/')) {
|
|
45
|
+
throw new TypeError(
|
|
46
|
+
`${name} is not a valid icon name. "name" must be named like [size]/[Name].`
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
loaders.set(name, function customLoader() {
|
|
51
|
+
return loadFromRawUrl(url)
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
static get observedAttributes() {
|
|
57
|
+
return attributes
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private svgContent?: string
|
|
61
|
+
private observer?: IntersectionObserver
|
|
62
|
+
|
|
63
|
+
get props() {
|
|
64
|
+
const partial = Object.fromEntries(
|
|
65
|
+
attributes.map((attribute) => [attribute, this.getAttribute(attribute)])
|
|
66
|
+
) as Record<typeof attributes[number], string | null>
|
|
67
|
+
|
|
68
|
+
const name = partial.name
|
|
69
|
+
|
|
70
|
+
if (name === null) {
|
|
71
|
+
throw new TypeError('property "name" is required.')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!name.includes('/')) {
|
|
75
|
+
throw new TypeError(
|
|
76
|
+
`${name} is not a valid icon name. "name" must be named like [size]/[Name].`
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
...partial,
|
|
82
|
+
name,
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
get forceResizedSize() {
|
|
87
|
+
if (this.props['unsafe-non-guideline-scale'] === null) {
|
|
88
|
+
return null
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const [size] = this.props.name.split('/')
|
|
92
|
+
const scale = Number(this.props['unsafe-non-guideline-scale'])
|
|
93
|
+
|
|
94
|
+
switch (size) {
|
|
95
|
+
case 'Inline': {
|
|
96
|
+
return 16 * scale
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
default: {
|
|
100
|
+
return Number(size) * scale
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
get scaledSize() {
|
|
106
|
+
const [size] = this.props.name.split('/')
|
|
107
|
+
|
|
108
|
+
const scale = Number(this.props.scale ?? '1')
|
|
109
|
+
|
|
110
|
+
switch (size) {
|
|
111
|
+
case 'Inline': {
|
|
112
|
+
switch (scale) {
|
|
113
|
+
case 2: {
|
|
114
|
+
return 32
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
default: {
|
|
118
|
+
return 16
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
case '24': {
|
|
124
|
+
return Number(size) * scale
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
default: {
|
|
128
|
+
return Number(size)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
constructor() {
|
|
134
|
+
super()
|
|
135
|
+
this.attachShadow({ mode: 'open' })
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
connectedCallback() {
|
|
139
|
+
this.render()
|
|
140
|
+
this.update()
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
disconnectedCallback() {
|
|
144
|
+
this.observer?.disconnect()
|
|
145
|
+
this.observer = undefined
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
attributeChangedCallback() {
|
|
149
|
+
this.update()
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
render() {
|
|
153
|
+
const size = this.forceResizedSize ?? this.scaledSize
|
|
154
|
+
|
|
155
|
+
return render(
|
|
156
|
+
html`
|
|
157
|
+
<style>
|
|
158
|
+
:host {
|
|
159
|
+
display: inline-flex;
|
|
160
|
+
--size: ${size}px;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
svg {
|
|
164
|
+
width: var(--size);
|
|
165
|
+
height: var(--size);
|
|
166
|
+
}
|
|
167
|
+
</style>
|
|
168
|
+
${this.svgContent !== undefined
|
|
169
|
+
? unsafeSVG(this.svgContent)
|
|
170
|
+
: html`<svg viewBox="0 0 ${size} ${size}"></svg>`}
|
|
171
|
+
`,
|
|
172
|
+
this.shadowRoot!
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
private update() {
|
|
177
|
+
void this.waitUntilVisible().then(async () => {
|
|
178
|
+
const { name } = this.props
|
|
179
|
+
const loader = loaders.get(name) ?? loadFromFile
|
|
180
|
+
|
|
181
|
+
this.svgContent = await loader(name)
|
|
182
|
+
this.render()
|
|
183
|
+
})
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private waitUntilVisible() {
|
|
187
|
+
return new Promise<void>((resolve) => {
|
|
188
|
+
this.observer = new IntersectionObserver(
|
|
189
|
+
([first]) => {
|
|
190
|
+
if (first.isIntersecting) {
|
|
191
|
+
this.observer?.disconnect()
|
|
192
|
+
this.observer = undefined
|
|
193
|
+
resolve()
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
{ rootMargin: `${ROOT_MARGIN}px` }
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
this.observer.observe(this)
|
|
200
|
+
})
|
|
201
|
+
}
|
|
202
|
+
}
|
package/src/filenames.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** This file is auto generated. DO NOT EDIT BY HAND. */
|
|
2
|
+
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
|
|
5
|
+
// prettier-ignore
|
|
6
|
+
export const KNOWN_ICON_FILES = ["32/ShareIos","32/Dot","32/Message","32/Gift","32/Close","32/Prev","32/Next","32/PullDown","32/PullUp","32/Expand","32/Collapse","32/Edit","32/ShareAndroid","32/BookmarkOff","32/BookmarkOn","32/NovelViewerSettings","32/CommentOff","32/CommentOn","32/Home","32/Index","32/Serif","32/Camera","32/Delete","32/Pan","32/RollVertical","32/RollHorizontal","32/ZoomIn","32/Upload","32/Shopping","32/User","32/HorizontalWriting","32/Notification","32/SansSerif","32/VerticalWriting","32/NotificationOff","24/Expand","24/Collapse","24/Close","24/Pencil","24/PencilDraw","24/PencilText","24/Reorder","24/Add","24/Subtract","24/Star","24/Check","24/Send","24/LockLock","24/LockUnlock","24/Up","24/Down","24/ReloadLoop","24/Reload","24/Options","24/CommentOutline","24/Trash","24/TrashAlt","24/ShareIos","24/ViewGrid3Columns","24/ViewGrid2Columns","24/ViewList","24/Upload","24/UploadAlt","24/DownloadAlt","24/ArrowUp","24/LikeOff","24/LikeOn","24/ArrowDown","24/OptionsAlt","24/PencilLive","24/OpenInNew","24/Settings","24/Roll","24/Calendar","24/Save","24/Logout","24/CommentFill","24/ShareAndroid","16/More","16/Back","16/Search","16/Add","16/Check","16/Menu","16/Dot","16/Book","16/ArrowDown","16/Speaker","16/Remove","16/BookmarkOn","16/BookmarkOff","16/Filter","16/Error","16/Info","16/Pencil","Inline/LikeOff","Inline/View","Inline/BookmarkOff","Inline/BookmarkOn","Inline/Breadcrumbs","Inline/More","Inline/ImageResponse","Inline/Lock","Inline/External","Inline/Location","Inline/View","Inline/Like","Inline/Smile","Inline/SmileOn","Inline/Check","Inline/List","Inline/ContextMenu","Inline/Add","Inline/Remove","Inline/Images","Inline/Nextworks","Inline/Filter","Inline/Users","24/Next","24/PullDown","24/PullUp","24/Prev","24/Dot","24/Notification","24/NotificationOff","24/Search","24/Menu","24/Index","24/Services","24/Error","24/Home","24/Warning","24/Info","24/QuestionOutline","24/ChatBot","24/ErrorOctagon","24/Question","24/Alart","24/DotAlt","24/ImageHidden","24/AddRubi","24/ImageReplace","24/Text","24/AddText","24/FormatAlignRight","24/FormatAlignLeft","24/FormatAlignCenter","24/AddImage","24/ImgContain","24/ImgCover","24/BringForward","24/BringBackward","24/RotateRight","24/Palette","24/Duplicate","24/FormatLineSpacing","24/FormatLetterSpacing","24/Rotate90DegreesCc","24/Rotate90DegreesC","24/FormatFontSize","24/FormatFontFamily","24/FormatColorFill","24/FormatColorFillNoColor","24/ChromaticAberration","24/Move1","24/Play","24/Pause","24/Microphone","24/PauseAlt","24/CameraVideo","24/Camera","24/Fov","24/Sun","24/Shutter","24/Contrast","24/FrameEffect","24/Hue","24/Saturation","24/Glow","24/Binet","24/Overlay","24/Flare","24/Dust","24/Temperature","24/Filter","24/Usagi","24/Set","24/Gift","24/MobilePhone","24/Users","24/AddPeople","24/Person","24/Emoji","24/Shopping","24/UsagiAlt","24/Fashion","24/FaceEdit","24/DeviceRotation","24/Ar","24/FrameSize","24/Body","24/BodyEdit","24/HairEdit","24/ItemRemove","24/AddModel","24/ChangeCharactor","24/Pose","24/Show","24/ShowOutline","24/Hide","24/Idea","24/Book","24/Message","24/Images","24/Image","24/Video","24/Hashtag","24/ImageAlt","24/Discovery","24/Description","24/File","24/Archive","24/Invoice","24/Announcement","24/Link","24/Manga","24/Novels","24/Contest","24/LatestWorks","24/Ranking","24/Feed","24/Groups","24/Events","24/Projects","24/Codes","24/Invalid","32/LikeOff","32/LikeOn","32/LikeOnPrivate","24/ImageHidden","Inline/Folder","Inline/Pencil","Inline/Comment"] as const;
|
|
7
|
+
|
|
8
|
+
export type KnownIconFile = typeof KNOWN_ICON_FILES[number];
|
|
9
|
+
|
|
10
|
+
/* eslint-enable */
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PixivIcon, Props } from './PixivIcon'
|
|
2
|
+
export { PixivIcon, type KnownIconType, type Props } from './PixivIcon'
|
|
3
|
+
export { PixivIconLoadError } from './loaders'
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
interface Window {
|
|
7
|
+
PixivIcon: typeof PixivIcon
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
11
|
+
export namespace JSX {
|
|
12
|
+
interface IntrinsicElements {
|
|
13
|
+
'pixiv-icon': Props
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// TODO: HMR対応
|
|
19
|
+
if (!window.customElements.get(PixivIcon.tagName)) {
|
|
20
|
+
window.PixivIcon = PixivIcon
|
|
21
|
+
window.customElements.define(PixivIcon.tagName, PixivIcon)
|
|
22
|
+
}
|
package/src/loaders.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const cache = new Map<string, string>()
|
|
2
|
+
|
|
3
|
+
interface SvgModule {
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
5
|
+
__esModule: true
|
|
6
|
+
default: string
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class PixivIconLoadError extends Error {
|
|
10
|
+
constructor(message?: string) {
|
|
11
|
+
super(message)
|
|
12
|
+
Object.setPrototypeOf(this, new.target)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function createLoader(getPath: (attributeName: string) => Promise<string>) {
|
|
17
|
+
return async function getSvgString(attributeName: string): Promise<string> {
|
|
18
|
+
if (cache.has(attributeName)) {
|
|
19
|
+
return cache.get(attributeName)!
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const rawSvg = await getPath(attributeName)
|
|
23
|
+
.then((path) => fetch(path))
|
|
24
|
+
.then((response) => {
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new PixivIconLoadError(
|
|
27
|
+
`Failed to fetch <pixiv-icon name="${attributeName}">`
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return response.text()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
cache.set(attributeName, rawSvg)
|
|
35
|
+
|
|
36
|
+
return rawSvg
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type Loader = ReturnType<typeof createLoader>
|
|
41
|
+
|
|
42
|
+
const loadFromRawUrl: Loader = createLoader((attributeName) =>
|
|
43
|
+
Promise.resolve(attributeName)
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
const loadFromFile: Loader = createLoader(async (attributeName) => {
|
|
47
|
+
const [size, name] = attributeName.split('/')
|
|
48
|
+
|
|
49
|
+
const { default: filename } = (await import(
|
|
50
|
+
`../svg/${encodeURIComponent(size)}/${encodeURIComponent(name)}.svg`
|
|
51
|
+
)) as SvgModule
|
|
52
|
+
|
|
53
|
+
return filename
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
export const loaders = { loadFromRawUrl, loadFromFile }
|
package/svg/16/Add.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9 9h3a1 1 0 100-2H9V4a1 1 0 00-2 0v3H4a1 1 0 000 2h3v3a1 1 0 102 0V9z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9 9.586l2.293-2.293a1 1 0 111.414 1.414L8 13.414 3.293 8.707a1 1 0 011.414-1.414L7 9.586V3.5a1 1 0 012 0v6.086z" fill="currentColor"></path></svg>
|
package/svg/16/Back.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9.961 11.043a1 1 0 01-1.414 1.414L4.09 8l4.457-4.457a1 1 0 011.414 1.414L6.92 8l3.042 3.043z" fill="currentColor"></path></svg>
|
package/svg/16/Book.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M4.342 4.386A.5.5 0 004 4.86v6.946a.5.5 0 00.658.475l5-1.667A.5.5 0 0010 10.14V3.194a.5.5 0 00-.658-.475l-5 1.667z" fill="currentColor"></path><path d="M11.5 3.5a.5.5 0 00-.5.5v7.576l-5.582.93a.5.5 0 00.164.987l6-1A.5.5 0 0012 12V4a.5.5 0 00-.5-.5z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M8 11.5l5 2.5V4a2 2 0 00-2-2H5a2 2 0 00-2 2v10l5-2.5zm-4 .882l4-2 4 2V4a1 1 0 00-1-1H5a1 1 0 00-1 1v8.382z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M11 2H5a2 2 0 00-2 2v10l5-2.5 5 2.5V4a2 2 0 00-2-2z" fill="currentColor"></path></svg>
|
package/svg/16/Check.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M5.707 8.293a1 1 0 00-1.414 1.414L7 12.414l5.707-5.707a1 1 0 00-1.414-1.414L7 9.586 5.707 8.293z" fill="currentColor"></path></svg>
|
package/svg/16/Dot.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M3.5 9.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM8 9.5a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM14 8a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z" fill="currentColor"></path></svg>
|
package/svg/16/Error.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9 3.5a1 1 0 00-2 0v5a1 1 0 002 0v-5zM8 13.5A1.25 1.25 0 108 11a1.25 1.25 0 000 2.5z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M3.099 3.567A1 1 0 014 3h8a1 1 0 01.78 1.625L9 9.35V12a2 2 0 01-2 2V9.35L3.22 4.626a1 1 0 01-.121-1.058z" fill="currentColor"></path></svg>
|
package/svg/16/Info.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M8 16A8 8 0 118 0a8 8 0 010 16z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M14 8A6 6 0 112 8a6 6 0 0112 0zM8 6.25a1.25 1.25 0 100-2.5 1.25 1.25 0 000 2.5zm-1 1.5v3.5a1 1 0 102 0v-3.5a1 1 0 00-2 0z" fill="#fff"></path></svg>
|
package/svg/16/Menu.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M8 9.086L4.957 6.043a1 1 0 00-1.414 1.414L8 11.914l4.457-4.457a1 1 0 00-1.414-1.414L8 9.086z" fill="currentColor"></path></svg>
|
package/svg/16/More.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M6.043 4.957a1 1 0 011.414-1.414L11.914 8l-4.457 4.457a1 1 0 01-1.414-1.414L9.086 8 6.043 4.957z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M9.974 3.193a1 1 0 011.414 0l1.414 1.414a1 1 0 010 1.414l-1.06 1.061-2.829-2.828 1.061-1.061zM8.206 4.96L3.61 9.558l-.56 2.8a.5.5 0 00.588.588l2.8-.56 4.597-4.596-2.829-2.828z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M12.207 5.207a1 1 0 00-1.414-1.414L8 6.586 5.207 3.793a1 1 0 10-1.414 1.414L6.586 8l-2.793 2.793a1 1 0 101.414 1.414L8 9.414l2.793 2.793a1 1 0 001.414-1.414L9.414 8l2.793-2.793z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.757 12.172a5 5 0 111.414-1.414l2.036 2.035a1 1 0 01-1.414 1.414l-2.036-2.035zM11 8a3 3 0 11-6 0 3 3 0 016 0z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M7 5.875H5a1 1 0 00-1 1v2.25a1 1 0 001 1h2.063l3.086 3.037a.5.5 0 00.851-.356V3.181a.5.5 0 00-.848-.36L7 5.875z" fill="currentColor"></path></svg>
|
package/svg/24/Add.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 10h4a2 2 0 110 4h-4v4a2 2 0 11-4 0v-4H6a2 2 0 110-4h4V6a2 2 0 114 0v4z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 6h2c.55 0 1-.45 1-1s-.45-1-1-1h-2V2c0-.55-.45-1-1-1s-1 .45-1 1v2h-2c-.55 0-1 .45-1 1s.45 1 1 1h2v2c0 .55.45 1 1 1s1-.45 1-1V6z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M18 8a2 2 0 003 1.732V17a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h9.268A2 2 0 0017 7h1v1zm-7 7.51l-2.1-2.53a.493.493 0 00-.78.02l-2.49 3.2c-.26.33-.03.81.39.81h11.99a.5.5 0 00.4-.8l-3.51-4.68c-.2-.27-.6-.27-.8-.01L11 15.51z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 4a2 2 0 11-4 0 2 2 0 014 0z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M6 8a1 1 0 011-1h10a1 1 0 110 2h-2.5v8a1 1 0 11-2 0v-4h-1v4a1 1 0 11-2 0V9H7a1 1 0 01-1-1zm5.5 1v2h1V9h-1z" fill="currentColor"></path><path d="M6 11a1 1 0 00-.949.684l-3 9A1 1 0 003 22h18a1 1 0 00.949-1.316l-3-9A1 1 0 0018 11h-.5a1 1 0 00-.23 1.973L19.613 20H4.387l2.343-7.027A1 1 0 006.5 11H6z" fill="currentColor"></path><path d="M14 4a2 2 0 11-4 0 2 2 0 014 0z" stroke="#fff"></path><path clip-rule="evenodd" d="M6 8a1 1 0 011-1h10a1 1 0 110 2h-2.5v8a1 1 0 11-2 0v-4h-1v4a1 1 0 11-2 0V9H7a1 1 0 01-1-1zm5.5 1v2h1V9h-1z" stroke="#fff"></path><path d="M6 11a1 1 0 00-.949.684l-3 9A1 1 0 003 22h18a1 1 0 00.949-1.316l-3-9A1 1 0 0018 11h-.5a1 1 0 00-.23 1.973L19.613 20H4.387l2.343-7.027A1 1 0 006.5 11H6z" stroke="#fff"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 3a1 1 0 011 1v2h2a1 1 0 110 2h-2v2a1 1 0 11-2 0V8h-2a1 1 0 110-2h2V4a1 1 0 011-1z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M8.5 14.5a3.75 3.75 0 100-7.5 3.75 3.75 0 000 7.5zm0 0c-3.038 0-5.5 2.381-5.5 5.318V20a1 1 0 001 1h9a1 1 0 001-1v-.182c0-2.937-2.462-5.318-5.5-5.318z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M2.5 6a1 1 0 011-1h1a1 1 0 011 1v10.5a.5.5 0 01-.5.5.5.5 0 00-.5.5v.5a1 1 0 01-1 1h-2a1 1 0 110-2 1 1 0 001-1V6zM9.5 6a1 1 0 00-1-1h-1a1 1 0 00-1 1v12a1 1 0 001 1H9a.5.5 0 00.5-.5.5.5 0 01.5-.5h.5a1 1 0 100-2 1 1 0 01-1-1V6zM16.5 6a1 1 0 00-1-1h-1a1 1 0 00-1 1v10.5a.5.5 0 00.5.5.5.5 0 01.5.5v.5a1 1 0 001 1h6a1 1 0 100-2h-4a1 1 0 01-1-1v-3a1 1 0 011-1h4a1 1 0 100-2h-4a1 1 0 01-1-1V6zM20.5 5.5a.5.5 0 011 0v2a.5.5 0 01-1 0v-2zM23.5 5.5a.5.5 0 00-1 0v2a.5.5 0 001 0v-2z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 7h2c.55 0 1-.45 1-1s-.45-1-1-1h-2V3c0-.55-.45-1-1-1s-1 .45-1 1v2h-2c-.55 0-1 .45-1 1s.45 1 1 1h2v2c0 .55.45 1 1 1s1-.45 1-1V7z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.105 4c.793 0 1.51.491 1.794 1.228l5.251 13.845C16.49 20 15.81 21 14.81 21h-.02a1.436 1.436 0 01-1.34-.926L12.034 16H6.182L4.76 20.056A1.426 1.426 0 013.42 21a1.415 1.415 0 01-1.323-1.927L7.33 5.228A1.883 1.883 0 019.105 4zm.018 3.608L11.341 14H6.883l2.24-6.392z" fill="currentColor"></path></svg>
|
package/svg/24/Alart.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M8 2a4 4 0 00-4 4v11h16V6a4 4 0 00-4-4H8zm0 2a2 2 0 00-2 2v1a1 1 0 002 0V6h2a1 1 0 100-2H8z" fill="currentColor"></path><path d="M2 20a1 1 0 011-1h18a1 1 0 011 1v1a1 1 0 01-1 1H3a1 1 0 01-1-1v-1z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.366 5.858l7.272-2.828A1 1 0 0120 3.962v3.164a4.002 4.002 0 010 7.748v3.164a1 1 0 01-1.362.932l-7.272-2.828a3.004 3.004 0 00-.756-.185l-.61-.068V6.11l.61-.068a3 3 0 00.756-.185zM21 11a2 2 0 00-1-1.732v3.464A2 2 0 0021 11z" fill="currentColor"></path><path d="M8 6.333l-3.331.37A3 3 0 002 9.686v2.63a3 3 0 002.669 2.982l3.331.37V6.333zM4.586 17.286l.902 3.008a2.395 2.395 0 004.587-1.377l-.316-1.055-5.09-.565a3.204 3.204 0 01-.083-.01z" fill="currentColor"></path></svg>
|
package/svg/24/Ar.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M2 2h5a1 1 0 010 2H4v3a1 1 0 01-2 0V2zM22 2v5a1 1 0 11-2 0V4h-3a1 1 0 110-2h5zM22 22h-5a1 1 0 110-2h3v-3a1 1 0 112 0v5zM2 22v-5a1 1 0 112 0v3h3a1 1 0 110 2H2zM11.5 5.134a1 1 0 011 0l5.196 3a1 1 0 01.5.866v6a1 1 0 01-.5.866l-5.196 3a1 1 0 01-1 0l-5.196-3a1 1 0 01-.5-.866V9a1 1 0 01.5-.866l5.196-3zm-3.696 5.598v3.69L11 16.269v-3.69l-3.196-1.846zM13 12.577v3.69l3.196-1.844v-3.691L13 12.577zM15.196 9L12 10.845 8.804 9 12 7.155 15.196 9z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 5.5c0-.466 0-.699.076-.883a1 1 0 01.541-.54C3.801 4 4.034 4 4.5 4h15c.466 0 .699 0 .883.076a1 1 0 01.54.541c.077.184.077.417.077.883s0 .699-.076.883a1 1 0 01-.541.54C20.199 7 19.966 7 19.5 7h-15c-.466 0-.699 0-.883-.076a1 1 0 01-.54-.541C3 6.199 3 5.966 3 5.5z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M4 9.6c0-.56 0-.84.109-1.054a1 1 0 01.437-.437C4.76 8 5.04 8 5.6 8h12.8c.56 0 .84 0 1.054.109a1 1 0 01.437.437C20 8.76 20 9.04 20 9.6v5.6c0 1.68 0 2.52-.327 3.162a3 3 0 01-1.311 1.311C17.72 20 16.88 20 15.2 20H8.8c-1.68 0-2.52 0-3.162-.327a3 3 0 01-1.311-1.311C4 17.72 4 16.88 4 15.2V9.6zm6 .4a1 1 0 100 2h4a1 1 0 100-2h-4z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 19.414l-6.707-6.707a1 1 0 111.414-1.414L11 15.586V5a1 1 0 112 0v10.586l4.293-4.293a1 1 0 011.414 1.414L12 19.414z" fill="currentColor"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 4.586l6.707 6.707a1 1 0 01-1.414 1.414L13 8.414V19a1 1 0 11-2 0V8.414l-4.293 4.293a1 1 0 11-1.414-1.414L12 4.586z" fill="currentColor"></path></svg>
|