oddsgate-ds 1.0.213 → 1.0.215

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.
@@ -8,7 +8,6 @@ type GlossaryProps = {
8
8
  title: string;
9
9
  slug: string;
10
10
  }[]>;
11
- displayedCategories: string[];
12
11
  placeholder?: string;
13
12
  noResults?: boolean;
14
13
  backToTopButton?: boolean;
package/dist/types.d.ts CHANGED
@@ -755,7 +755,6 @@ type GlossaryProps = {
755
755
  title: string;
756
756
  slug: string;
757
757
  }[]>;
758
- displayedCategories: string[];
759
758
  placeholder?: string;
760
759
  noResults?: boolean;
761
760
  backToTopButton?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oddsgate-ds",
3
- "version": "1.0.213",
3
+ "version": "1.0.215",
4
4
  "description": "Miew theme component library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -24,9 +24,9 @@ const CategoriesWrapper: React.FC<CategoriesWrapperProps> = ({
24
24
  <StyledCategoryContent>
25
25
  {categoryItems.map((item, index) => (
26
26
  <StyledCategoryItem key={index}>
27
- <Button href={item.slug} variant="text">
28
- {item.title}
29
- </Button>
27
+ <a href={item.slug}>
28
+ <Button variant="text">{item.title}</Button>
29
+ </a>
30
30
  </StyledCategoryItem>
31
31
  ))}
32
32
  </StyledCategoryContent>
@@ -36,4 +36,4 @@ const CategoriesWrapper: React.FC<CategoriesWrapperProps> = ({
36
36
  )
37
37
  }
38
38
 
39
- export default CategoriesWrapper
39
+ export default CategoriesWrapper;
@@ -32,7 +32,7 @@ export const StyledCategoryContent = styled.div`
32
32
  padding: 2.5rem 0 3rem 0;
33
33
  `
34
34
  export const StyledCategoryItem = styled.div`
35
- & > button {
35
+ button {
36
36
  height: 34px;
37
37
  padding: 10px 40px;
38
38
  font-size: 24px;
@@ -10,14 +10,15 @@ const CategoryIndex: React.FC<CategoryIndexProps> = ({
10
10
  onChange,
11
11
  selectedCategory
12
12
  }) => {
13
-
14
13
  return (
15
14
  <StyledGlossaryCategoryIndex>
16
15
  {categories.map(category => (
17
16
  <StyledGlossaryCategoryIndexItem
18
17
  onClick={() => onChange(category)}
19
18
  isSelected={
20
- selectedCategory === category
19
+ category === '#'
20
+ ? selectedCategory === '84'
21
+ : selectedCategory === category
21
22
  }
22
23
  key={`category-${category}`}
23
24
  >
@@ -20,7 +20,6 @@ type GlossaryProps = {
20
20
  selectedCategory: string | null
21
21
  setSelectedCategory: (cat: string | null) => void
22
22
  categoryData: Record<string, { title: string; slug: string }[]>
23
- displayedCategories: string[]
24
23
  placeholder?: string
25
24
  noResults?: boolean
26
25
  backToTopButton?: boolean
@@ -34,7 +33,6 @@ export const Glossary: React.FC<GlossaryProps> = ({
34
33
  selectedCategory,
35
34
  setSelectedCategory,
36
35
  categoryData,
37
- displayedCategories,
38
36
  placeholder,
39
37
  noResults,
40
38
  backToTopButton,
@@ -42,8 +40,6 @@ export const Glossary: React.FC<GlossaryProps> = ({
42
40
  tryAnotherLetterText
43
41
  }) => {
44
42
  const categoryNames = Object.keys(categoryData)
45
- console.log("categoryData", categoryData)
46
- console.log("displayedCategories", displayedCategories)
47
43
  return (
48
44
  <StyledGlossary>
49
45
  <SearchBar
@@ -67,7 +63,7 @@ export const Glossary: React.FC<GlossaryProps> = ({
67
63
  ) : (
68
64
  <>
69
65
  <StyledGlossaryCategories>
70
- {displayedCategories.map(category => (
66
+ {categoryNames.map(category => (
71
67
  <CategoriesWrapper
72
68
  key={category}
73
69
  category={category}
@@ -1,262 +1,101 @@
1
1
  import React, { useState } from 'react'
2
+ import { Meta, StoryObj } from '@storybook/react'
2
3
  import Glossary from './Glossary.component'
3
- interface GlossaryItem {
4
- slug: string
5
- name: string
6
- }
7
-
8
- interface GlossaryCategory {
9
- name: string
10
- items: GlossaryItem[]
11
- }
12
4
 
13
- const categories: GlossaryCategory[] = [
14
- {
15
- name: 'A',
16
- items: [
17
- { slug: 'afk', name: 'AFK' },
18
- { slug: 'aimbot', name: 'AIMBOT' },
19
- { slug: 'aggro', name: 'Aggro' },
20
- { slug: 'aoe', name: 'AOE' },
21
- { slug: 'avatar', name: 'Avatar' },
22
- { slug: 'accuracy', name: 'Accuracy' },
23
- { slug: 'action-bar', name: 'Action Bar' },
24
- { slug: 'add-on', name: 'Add-on' },
25
- { slug: 'arena', name: 'Arena' },
26
- { slug: 'artifact', name: 'Artifact' }
27
- ]
28
- },
29
- {
30
- name: 'B',
31
- items: [
32
- { slug: 'buff', name: 'Buff' },
33
- { slug: 'boss', name: 'Boss' },
34
- { slug: 'build', name: 'Build' },
35
- { slug: 'ban', name: 'Ban' },
36
- { slug: 'beta', name: 'Beta' },
37
- { slug: 'blind', name: 'Blind' },
38
- { slug: 'block', name: 'Block' },
39
- { slug: 'bot', name: 'Bot' },
40
- { slug: 'bracket', name: 'Bracket' },
41
- { slug: 'burst', name: 'Burst' }
42
- ]
43
- },
44
- {
45
- name: 'C',
46
- items: [
47
- { slug: 'camp', name: 'Camp' },
48
- { slug: 'carry', name: 'Carry' },
49
- { slug: 'cc', name: 'Crowd Control' },
50
- { slug: 'cd', name: 'Cooldown' },
51
- { slug: 'cheese', name: 'Cheese' },
52
- { slug: 'clan', name: 'Clan' },
53
- { slug: 'combo', name: 'Combo' },
54
- { slug: 'crit', name: 'Critical Hit' },
55
- { slug: 'crafting', name: 'Crafting' },
56
- { slug: 'creep', name: 'Creep' }
57
- ]
58
- },
59
- {
60
- name: 'D',
61
- items: [
62
- { slug: 'debuff', name: 'Debuff' },
63
- { slug: 'dps', name: 'DPS' },
64
- { slug: 'drop', name: 'Drop' },
65
- { slug: 'duo', name: 'Duo' },
66
- { slug: 'dungeon', name: 'Dungeon' },
67
- { slug: 'draft', name: 'Draft' },
68
- { slug: 'dot', name: 'Damage Over Time' },
69
- { slug: 'disconnect', name: 'Disconnect' },
70
- { slug: 'drain', name: 'Drain' },
71
- { slug: 'drop-rate', name: 'Drop Rate' }
72
- ]
73
- },
74
- {
75
- name: 'E',
76
- items: [
77
- { slug: 'emote', name: 'Emote' },
78
- { slug: 'endgame', name: 'Endgame' },
79
- { slug: 'enemy', name: 'Enemy' },
80
- { slug: 'equip', name: 'Equip' },
81
- { slug: 'event', name: 'Event' },
82
- { slug: 'exploit', name: 'Exploit' },
83
- { slug: 'experience', name: 'Experience' },
84
- { slug: 'ez', name: 'EZ' },
85
- { slug: 'elite', name: 'Elite' },
86
- { slug: 'escape', name: 'Escape' }
87
- ]
88
- },
89
- {
90
- name: 'F',
91
- items: [
92
- { slug: 'farm', name: 'Farm' },
93
- { slug: 'feed', name: 'Feed' },
94
- { slug: 'flank', name: 'Flank' },
95
- { slug: 'frag', name: 'Frag' },
96
- { slug: 'fps', name: 'FPS' },
97
- { slug: 'friendly-fire', name: 'Friendly Fire' },
98
- { slug: 'faction', name: 'Faction' },
99
- { slug: 'fov', name: 'Field of View' },
100
- { slug: 'freeze', name: 'Freeze' },
101
- { slug: 'full-party', name: 'Full Party' }
102
- ]
103
- },
104
- {
105
- name: 'G',
106
- items: [
107
- { slug: 'gg', name: 'GG' },
108
- { slug: 'gank', name: 'Gank' },
109
- { slug: 'gear', name: 'Gear' },
110
- { slug: 'grind', name: 'Grind' },
111
- { slug: 'guild', name: 'Guild' },
112
- { slug: 'glitch', name: 'Glitch' },
113
- { slug: 'gold', name: 'Gold' },
114
- { slug: 'group', name: 'Group' },
115
- { slug: 'grenade', name: 'Grenade' },
116
- { slug: 'global', name: 'Global' }
117
- ]
118
- },
119
- {
120
- name: 'H',
121
- items: [
122
- { slug: 'heal', name: 'Heal' },
123
- { slug: 'headshot', name: 'Headshot' },
124
- { slug: 'hp', name: 'HP' },
125
- { slug: 'hud', name: 'HUD' },
126
- { slug: 'hardcore', name: 'Hardcore' },
127
- { slug: 'hero', name: 'Hero' },
128
- { slug: 'hitbox', name: 'Hitbox' },
129
- { slug: 'host', name: 'Host' },
130
- { slug: 'hotkey', name: 'Hotkey' },
131
- { slug: 'hunter', name: 'Hunter' }
132
- ]
133
- }
5
+ const categories = [
6
+ {
7
+ name: 'A',
8
+ items: [
9
+ { name: 'Apple', slug: 'apple' },
10
+ { name: 'Apricot', slug: 'apricot' }
11
+ ]
12
+ },
13
+ {
14
+ name: 'B',
15
+ items: [
16
+ { name: 'Banana', slug: 'banana' },
17
+ { name: 'Blueberry', slug: 'blueberry' }
18
+ ]
19
+ }
134
20
  ]
135
21
 
136
- // Helper to build categoryData from categories and items
137
- interface BuildCategoryDataItem {
138
- slug: string
139
- name: string
140
- }
141
-
142
- interface BuildCategoryDataCategory {
143
- name: string
144
- items: BuildCategoryDataItem[]
145
- }
146
-
147
- interface CategoryDataItem {
148
- title: string
149
- slug: string
150
- }
151
-
152
- interface CategoryData {
153
- [categoryName: string]: CategoryDataItem[]
154
- }
155
-
156
- function buildCategoryData(
157
- categories: BuildCategoryDataCategory[],
158
- items: BuildCategoryDataItem[]
159
- ): CategoryData {
160
- const data: CategoryData = {}
161
- categories.forEach((cat: BuildCategoryDataCategory) => {
162
- data[cat.name] = cat.items.map((item: BuildCategoryDataItem) => ({
163
- title: item.name,
164
- slug: item.slug
165
- }))
166
- })
167
- return data
168
- }
169
-
170
- // Helper to filter items by searchTerm and selectedCategory
171
- function getDisplayedCategories(
172
- categories: any[],
173
- items: never[],
174
- searchTerm: string,
175
- selectedCategory: string | null
176
- ) {
177
- const filtered: Record<string | number, any[]> = {}
178
- categories.forEach((cat: { items: any[]; name: string | number }) => {
179
- const catItems = cat.items
180
- .map((item: { name: any }) => item.name)
181
- .filter(
182
- ( name: string) =>
183
- (!searchTerm ||
184
- name.toLowerCase().includes(searchTerm.toLowerCase())) &&
185
- (!selectedCategory || cat.name === selectedCategory)
186
- )
187
- if (catItems.length > 0) filtered[cat.name] = catItems
22
+ // Helper to build categoryData from categories
23
+ function buildCategoryData(categories: any) {
24
+ const data: Record<string, { title: string; slug: string }[]> = {}
25
+ categories.forEach((cat: any) => {
26
+ data[cat.name] = cat.items.map((item: any) => ({
27
+ title: item.name,
28
+ slug: item.slug
29
+ }))
188
30
  })
189
- return Object.keys(filtered)
31
+ return data
190
32
  }
191
33
 
34
+ const categoryData = buildCategoryData(categories)
192
35
 
193
- // Build categoryData for the Glossary component
194
- const categoryData = buildCategoryData(categories, [])
195
-
196
- export default {
36
+ const meta: Meta<typeof Glossary> = {
197
37
  title: 'Organisms/Glossary',
198
- component: Glossary
38
+ component: Glossary,
39
+ parameters: {
40
+ backgrounds: {
41
+ default: 'glossary-bg',
42
+ values: [{ name: 'glossary-bg', value: '#33052F' }]
43
+ }
44
+ }
199
45
  }
46
+ export default meta
200
47
 
201
- export const Basic = () => {
48
+ const Template = (args: any) => {
202
49
  const [searchTerm, setSearchTerm] = useState('')
203
50
  const [selectedCategory, setSelectedCategory] = useState<string | null>(null)
204
51
 
205
- // For demo, just show all categories if nothing is selected
206
- const displayedCategories = getDisplayedCategories(
207
- categories,
208
- [],
209
- searchTerm,
210
- selectedCategory
211
- )
52
+ // Filter items by searchTerm
53
+ const filterItems = (items: { title: string; slug: string }[]) =>
54
+ items.filter(item =>
55
+ item.title.toLowerCase().includes(searchTerm.toLowerCase())
56
+ )
212
57
 
213
- return (
214
- <Glossary
215
- searchTerm={searchTerm}
216
- setSearchTerm={setSearchTerm}
217
- selectedCategory={selectedCategory}
218
- setSelectedCategory={setSelectedCategory}
219
- categoryData={categoryData}
220
- displayedCategories={displayedCategories}
221
- placeholder="What are you looking for?"
222
- />
223
- )
224
- }
58
+ // Filter categoryData by selectedCategory and searchTerm
59
+ let filteredCategoryData: Partial<typeof categoryData> = {}
225
60
 
226
- Basic.parameters = {
227
- backgrounds: {
228
- default: 'glossary-bg',
229
- values: [{ name: 'glossary-bg', value: '#33052F' }]
61
+ if (selectedCategory && categoryData[selectedCategory]) {
62
+ const filteredItems = filterItems(categoryData[selectedCategory as string])
63
+ if (filteredItems.length > 0) {
64
+ filteredCategoryData[selectedCategory] = filteredItems
65
+ }
66
+ } else {
67
+ Object.entries(categoryData).forEach(([cat, items]) => {
68
+ const filteredItems = filterItems(items)
69
+ if (filteredItems.length > 0) {
70
+ filteredCategoryData[cat] = filteredItems
71
+ }
72
+ })
230
73
  }
231
- }
232
74
 
233
- export const NoResults = () => {
234
- const [searchTerm, setSearchTerm] = useState('zzzz') // unlikely to match anything
235
- const [selectedCategory, setSelectedCategory] = useState<string | null>(null)
236
-
237
- const displayedCategories = getDisplayedCategories(
238
- categories,
239
- [],
240
- searchTerm,
241
- selectedCategory
242
- )
75
+ // Determine if there are no results
76
+ const noResults = Object.keys(filteredCategoryData).length === 0
243
77
 
244
78
  return (
245
79
  <Glossary
80
+ {...args}
246
81
  searchTerm={searchTerm}
247
82
  setSearchTerm={setSearchTerm}
248
83
  selectedCategory={selectedCategory}
249
84
  setSelectedCategory={setSelectedCategory}
250
- categoryData={categoryData}
251
- displayedCategories={displayedCategories}
252
- placeholder="What are you looking for?"
85
+ categoryData={filteredCategoryData}
86
+ noResults={noResults}
253
87
  />
254
88
  )
255
89
  }
256
90
 
257
- NoResults.parameters = {
258
- backgrounds: {
259
- default: 'glossary-bg',
260
- values: [{ name: 'glossary-bg', value: '#33052F' }]
91
+ export const Default: StoryObj = {
92
+ render: Template,
93
+ args: {
94
+ placeholder: 'Search glossary...',
95
+ noResults: false,
96
+ backToTopButton: 'Back to top',
97
+ noResultsText: 'No results found',
98
+ tryAnotherLetterText: 'Try another letter'
261
99
  }
262
100
  }
101
+