@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.
Files changed (270) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +90 -0
  3. package/dist/PixivIcon.d.ts +35 -0
  4. package/dist/PixivIcon.d.ts.map +1 -0
  5. package/dist/PixivIcon.story.d.ts +40 -0
  6. package/dist/PixivIcon.story.d.ts.map +1 -0
  7. package/dist/PixivIcon.test.d.ts +2 -0
  8. package/dist/PixivIcon.test.d.ts.map +1 -0
  9. package/dist/filenames.d.ts +4 -0
  10. package/dist/filenames.d.ts.map +1 -0
  11. package/dist/index.cjs +2 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.d.ts +14 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.modern.js +15 -0
  16. package/dist/index.modern.js.map +1 -0
  17. package/dist/index.module.js +2 -0
  18. package/dist/index.module.js.map +1 -0
  19. package/dist/loaders.d.ts +11 -0
  20. package/dist/loaders.d.ts.map +1 -0
  21. package/package.json +41 -0
  22. package/src/16/TestIconThatNeverExists.svg +1 -0
  23. package/src/PixivIcon.story.tsx +165 -0
  24. package/src/PixivIcon.test.tsx +72 -0
  25. package/src/PixivIcon.ts +202 -0
  26. package/src/declaration.d.ts +4 -0
  27. package/src/filenames.ts +10 -0
  28. package/src/index.ts +22 -0
  29. package/src/loaders.ts +56 -0
  30. package/svg/16/Add.svg +1 -0
  31. package/svg/16/ArrowDown.svg +1 -0
  32. package/svg/16/Back.svg +1 -0
  33. package/svg/16/Book.svg +1 -0
  34. package/svg/16/BookmarkOff.svg +1 -0
  35. package/svg/16/BookmarkOn.svg +1 -0
  36. package/svg/16/Check.svg +1 -0
  37. package/svg/16/Dot.svg +1 -0
  38. package/svg/16/Error.svg +1 -0
  39. package/svg/16/Filter.svg +1 -0
  40. package/svg/16/Info.svg +1 -0
  41. package/svg/16/Menu.svg +1 -0
  42. package/svg/16/More.svg +1 -0
  43. package/svg/16/Pencil.svg +1 -0
  44. package/svg/16/Remove.svg +1 -0
  45. package/svg/16/Search.svg +1 -0
  46. package/svg/16/Speaker.svg +1 -0
  47. package/svg/24/Add.svg +1 -0
  48. package/svg/24/AddImage.svg +1 -0
  49. package/svg/24/AddModel.svg +1 -0
  50. package/svg/24/AddPeople.svg +1 -0
  51. package/svg/24/AddRubi.svg +1 -0
  52. package/svg/24/AddText.svg +1 -0
  53. package/svg/24/Alart.svg +1 -0
  54. package/svg/24/Announcement.svg +1 -0
  55. package/svg/24/Ar.svg +1 -0
  56. package/svg/24/Archive.svg +1 -0
  57. package/svg/24/ArrowDown.svg +1 -0
  58. package/svg/24/ArrowUp.svg +1 -0
  59. package/svg/24/Binet.svg +1 -0
  60. package/svg/24/Body.svg +1 -0
  61. package/svg/24/BodyEdit.svg +1 -0
  62. package/svg/24/Book.svg +1 -0
  63. package/svg/24/BringBackward.svg +1 -0
  64. package/svg/24/BringForward.svg +1 -0
  65. package/svg/24/Calendar.svg +1 -0
  66. package/svg/24/Camera.svg +1 -0
  67. package/svg/24/CameraVideo.svg +1 -0
  68. package/svg/24/ChangeCharactor.svg +1 -0
  69. package/svg/24/ChatBot.svg +1 -0
  70. package/svg/24/Check.svg +1 -0
  71. package/svg/24/ChromaticAberration.svg +1 -0
  72. package/svg/24/Close.svg +1 -0
  73. package/svg/24/Codes.svg +1 -0
  74. package/svg/24/Collapse.svg +1 -0
  75. package/svg/24/CommentFill.svg +1 -0
  76. package/svg/24/CommentOutline.svg +1 -0
  77. package/svg/24/Contest.svg +1 -0
  78. package/svg/24/Contrast.svg +1 -0
  79. package/svg/24/Description.svg +1 -0
  80. package/svg/24/DeviceRotation.svg +1 -0
  81. package/svg/24/Discovery.svg +4 -0
  82. package/svg/24/Dot.svg +1 -0
  83. package/svg/24/DotAlt.svg +1 -0
  84. package/svg/24/Down.svg +1 -0
  85. package/svg/24/DownloadAlt.svg +1 -0
  86. package/svg/24/Duplicate.svg +1 -0
  87. package/svg/24/Dust.svg +54 -0
  88. package/svg/24/Emoji.svg +1 -0
  89. package/svg/24/Error.svg +1 -0
  90. package/svg/24/ErrorOctagon.svg +1 -0
  91. package/svg/24/Events.svg +1 -0
  92. package/svg/24/Expand.svg +1 -0
  93. package/svg/24/FaceEdit.svg +1 -0
  94. package/svg/24/Fashion.svg +1 -0
  95. package/svg/24/Feed.svg +1 -0
  96. package/svg/24/File.svg +1 -0
  97. package/svg/24/Filter.svg +1 -0
  98. package/svg/24/Flare.svg +1 -0
  99. package/svg/24/FormatAlignCenter.svg +1 -0
  100. package/svg/24/FormatAlignLeft.svg +1 -0
  101. package/svg/24/FormatAlignRight.svg +1 -0
  102. package/svg/24/FormatColorFill.svg +1 -0
  103. package/svg/24/FormatColorFillNoColor.svg +1 -0
  104. package/svg/24/FormatFontFamily.svg +1 -0
  105. package/svg/24/FormatFontSize.svg +1 -0
  106. package/svg/24/FormatLetterSpacing.svg +1 -0
  107. package/svg/24/FormatLineSpacing.svg +1 -0
  108. package/svg/24/Fov.svg +1 -0
  109. package/svg/24/FrameEffect.svg +3 -0
  110. package/svg/24/FrameSize.svg +1 -0
  111. package/svg/24/Gift.svg +1 -0
  112. package/svg/24/Glow.svg +1 -0
  113. package/svg/24/Groups.svg +1 -0
  114. package/svg/24/HairEdit.svg +1 -0
  115. package/svg/24/Hashtag.svg +1 -0
  116. package/svg/24/Hide.svg +1 -0
  117. package/svg/24/Home.svg +1 -0
  118. package/svg/24/Hue.svg +1 -0
  119. package/svg/24/Idea.svg +1 -0
  120. package/svg/24/Image.svg +1 -0
  121. package/svg/24/ImageAlt.svg +1 -0
  122. package/svg/24/ImageHidden.svg +1 -0
  123. package/svg/24/ImageReplace.svg +1 -0
  124. package/svg/24/Images.svg +1 -0
  125. package/svg/24/ImgContain.svg +1 -0
  126. package/svg/24/ImgCover.svg +1 -0
  127. package/svg/24/Index.svg +1 -0
  128. package/svg/24/Info.svg +1 -0
  129. package/svg/24/Invalid.svg +1 -0
  130. package/svg/24/Invoice.svg +1 -0
  131. package/svg/24/ItemRemove.svg +1 -0
  132. package/svg/24/LatestWorks.svg +1 -0
  133. package/svg/24/LikeOff.svg +1 -0
  134. package/svg/24/LikeOn.svg +1 -0
  135. package/svg/24/Link.svg +1 -0
  136. package/svg/24/LockLock.svg +1 -0
  137. package/svg/24/LockUnlock.svg +1 -0
  138. package/svg/24/Logout.svg +1 -0
  139. package/svg/24/Manga.svg +1 -0
  140. package/svg/24/Menu.svg +1 -0
  141. package/svg/24/Message.svg +1 -0
  142. package/svg/24/Microphone.svg +1 -0
  143. package/svg/24/MobilePhone.svg +1 -0
  144. package/svg/24/Move1.svg +1 -0
  145. package/svg/24/Next.svg +1 -0
  146. package/svg/24/Notification.svg +1 -0
  147. package/svg/24/NotificationOff.svg +1 -0
  148. package/svg/24/Novels.svg +1 -0
  149. package/svg/24/OpenInNew.svg +1 -0
  150. package/svg/24/Options.svg +1 -0
  151. package/svg/24/OptionsAlt.svg +1 -0
  152. package/svg/24/Overlay.svg +1 -0
  153. package/svg/24/Palette.svg +1 -0
  154. package/svg/24/Pause.svg +5 -0
  155. package/svg/24/PauseAlt.svg +1 -0
  156. package/svg/24/Pencil.svg +1 -0
  157. package/svg/24/PencilDraw.svg +1 -0
  158. package/svg/24/PencilLive.svg +1 -0
  159. package/svg/24/PencilText.svg +1 -0
  160. package/svg/24/Person.svg +1 -0
  161. package/svg/24/Play.svg +4 -0
  162. package/svg/24/Pose.svg +1 -0
  163. package/svg/24/Prev.svg +1 -0
  164. package/svg/24/Projects.svg +1 -0
  165. package/svg/24/PullDown.svg +1 -0
  166. package/svg/24/PullUp.svg +1 -0
  167. package/svg/24/Question.svg +1 -0
  168. package/svg/24/QuestionOutline.svg +1 -0
  169. package/svg/24/Ranking.svg +1 -0
  170. package/svg/24/Reload.svg +1 -0
  171. package/svg/24/ReloadLoop.svg +1 -0
  172. package/svg/24/Reorder.svg +1 -0
  173. package/svg/24/Roll.svg +1 -0
  174. package/svg/24/Rotate90DegreesC.svg +1 -0
  175. package/svg/24/Rotate90DegreesCc.svg +1 -0
  176. package/svg/24/RotateRight.svg +1 -0
  177. package/svg/24/Saturation.svg +1 -0
  178. package/svg/24/Save.svg +1 -0
  179. package/svg/24/Search.svg +1 -0
  180. package/svg/24/Send.svg +1 -0
  181. package/svg/24/Services.svg +1 -0
  182. package/svg/24/Set.svg +1 -0
  183. package/svg/24/Settings.svg +1 -0
  184. package/svg/24/ShareAndroid.svg +1 -0
  185. package/svg/24/ShareIos.svg +1 -0
  186. package/svg/24/Shopping.svg +1 -0
  187. package/svg/24/Show.svg +1 -0
  188. package/svg/24/ShowOutline.svg +1 -0
  189. package/svg/24/Shutter.svg +1 -0
  190. package/svg/24/Star.svg +1 -0
  191. package/svg/24/Subtract.svg +1 -0
  192. package/svg/24/Sun.svg +1 -0
  193. package/svg/24/Temperature.svg +1 -0
  194. package/svg/24/Text.svg +1 -0
  195. package/svg/24/Trash.svg +1 -0
  196. package/svg/24/TrashAlt.svg +1 -0
  197. package/svg/24/Up.svg +1 -0
  198. package/svg/24/Upload.svg +1 -0
  199. package/svg/24/UploadAlt.svg +1 -0
  200. package/svg/24/Usagi.svg +1 -0
  201. package/svg/24/UsagiAlt.svg +1 -0
  202. package/svg/24/Users.svg +1 -0
  203. package/svg/24/Video.svg +1 -0
  204. package/svg/24/ViewGrid2Columns.svg +1 -0
  205. package/svg/24/ViewGrid3Columns.svg +1 -0
  206. package/svg/24/ViewList.svg +1 -0
  207. package/svg/24/Warning.svg +1 -0
  208. package/svg/32/BookmarkOff.svg +1 -0
  209. package/svg/32/BookmarkOn.svg +1 -0
  210. package/svg/32/Camera.svg +1 -0
  211. package/svg/32/Close.svg +1 -0
  212. package/svg/32/Collapse.svg +1 -0
  213. package/svg/32/CommentOff.svg +1 -0
  214. package/svg/32/CommentOn.svg +1 -0
  215. package/svg/32/Delete.svg +1 -0
  216. package/svg/32/Dot.svg +1 -0
  217. package/svg/32/Edit.svg +1 -0
  218. package/svg/32/Expand.svg +1 -0
  219. package/svg/32/Gift.svg +1 -0
  220. package/svg/32/Home.svg +1 -0
  221. package/svg/32/HorizontalWriting.svg +1 -0
  222. package/svg/32/Index.svg +1 -0
  223. package/svg/32/LikeOff.svg +4 -0
  224. package/svg/32/LikeOn.svg +3 -0
  225. package/svg/32/LikeOnPrivate.svg +6 -0
  226. package/svg/32/Message.svg +1 -0
  227. package/svg/32/Next.svg +1 -0
  228. package/svg/32/Notification.svg +1 -0
  229. package/svg/32/NotificationOff.svg +1 -0
  230. package/svg/32/NovelViewerSettings.svg +1 -0
  231. package/svg/32/Pan.svg +1 -0
  232. package/svg/32/Prev.svg +1 -0
  233. package/svg/32/PullDown.svg +1 -0
  234. package/svg/32/PullUp.svg +1 -0
  235. package/svg/32/RollHorizontal.svg +1 -0
  236. package/svg/32/RollVertical.svg +1 -0
  237. package/svg/32/SansSerif.svg +1 -0
  238. package/svg/32/Serif.svg +1 -0
  239. package/svg/32/ShareAndroid.svg +1 -0
  240. package/svg/32/ShareIos.svg +1 -0
  241. package/svg/32/Shopping.svg +1 -0
  242. package/svg/32/Upload.svg +1 -0
  243. package/svg/32/User.svg +1 -0
  244. package/svg/32/VerticalWriting.svg +1 -0
  245. package/svg/32/ZoomIn.svg +1 -0
  246. package/svg/Inline/Add.svg +1 -0
  247. package/svg/Inline/BookmarkOff.svg +5 -0
  248. package/svg/Inline/BookmarkOn.svg +1 -0
  249. package/svg/Inline/Breadcrumbs.svg +1 -0
  250. package/svg/Inline/Check.svg +1 -0
  251. package/svg/Inline/Comment.svg +1 -0
  252. package/svg/Inline/ContextMenu.svg +1 -0
  253. package/svg/Inline/External.svg +1 -0
  254. package/svg/Inline/Filter.svg +1 -0
  255. package/svg/Inline/Folder.svg +1 -0
  256. package/svg/Inline/ImageResponse.svg +1 -0
  257. package/svg/Inline/Images.svg +1 -0
  258. package/svg/Inline/Like.svg +1 -0
  259. package/svg/Inline/LikeOff.svg +1 -0
  260. package/svg/Inline/List.svg +1 -0
  261. package/svg/Inline/Location.svg +1 -0
  262. package/svg/Inline/Lock.svg +1 -0
  263. package/svg/Inline/More.svg +1 -0
  264. package/svg/Inline/Nextworks.svg +1 -0
  265. package/svg/Inline/Pencil.svg +1 -0
  266. package/svg/Inline/Remove.svg +1 -0
  267. package/svg/Inline/Smile.svg +1 -0
  268. package/svg/Inline/SmileOn.svg +1 -0
  269. package/svg/Inline/Users.svg +1 -0
  270. 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
+ // }
@@ -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
+ }
@@ -0,0 +1,4 @@
1
+ declare module '*.svg' {
2
+ const svg: string
3
+ export = svg
4
+ }
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>
@@ -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>