@luquimbo/bi-superpowers 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.claude-plugin/plugin.json +8 -0
  2. package/.mcp.json +25 -0
  3. package/AGENTS.md +244 -0
  4. package/CHANGELOG.md +265 -0
  5. package/LICENSE +21 -0
  6. package/README.md +211 -0
  7. package/bin/build-plugin.js +30 -0
  8. package/bin/cli.js +1064 -0
  9. package/bin/commands/add.js +533 -0
  10. package/bin/commands/add.test.js +77 -0
  11. package/bin/commands/build-desktop.js +166 -0
  12. package/bin/commands/changelog.js +443 -0
  13. package/bin/commands/diff.js +325 -0
  14. package/bin/commands/lint.js +419 -0
  15. package/bin/commands/lint.test.js +103 -0
  16. package/bin/commands/mcp-setup.js +246 -0
  17. package/bin/commands/pull.js +287 -0
  18. package/bin/commands/pull.test.js +36 -0
  19. package/bin/commands/push.js +231 -0
  20. package/bin/commands/push.test.js +14 -0
  21. package/bin/commands/search.js +344 -0
  22. package/bin/commands/search.test.js +115 -0
  23. package/bin/commands/setup.js +545 -0
  24. package/bin/commands/setup.test.js +46 -0
  25. package/bin/commands/sync-profile.js +405 -0
  26. package/bin/commands/sync-profile.test.js +14 -0
  27. package/bin/commands/sync-source.js +418 -0
  28. package/bin/commands/sync-source.test.js +14 -0
  29. package/bin/commands/watch.js +206 -0
  30. package/bin/lib/generators/claude-plugin.js +266 -0
  31. package/bin/lib/generators/claude-plugin.test.js +110 -0
  32. package/bin/lib/generators/index.js +116 -0
  33. package/bin/lib/generators/shared.js +282 -0
  34. package/bin/lib/licensing/index.js +35 -0
  35. package/bin/lib/licensing/storage.js +364 -0
  36. package/bin/lib/licensing/storage.test.js +55 -0
  37. package/bin/lib/licensing/validator.js +213 -0
  38. package/bin/lib/licensing/validator.test.js +137 -0
  39. package/bin/lib/microsoft-mcp.js +176 -0
  40. package/bin/lib/microsoft-mcp.test.js +106 -0
  41. package/bin/lib/skills.js +84 -0
  42. package/bin/mcp/powerbi-modeling-launcher.js +38 -0
  43. package/bin/postinstall.js +44 -0
  44. package/bin/utils/errors.js +159 -0
  45. package/bin/utils/git.js +298 -0
  46. package/bin/utils/logger.js +142 -0
  47. package/bin/utils/mcp-detect.js +274 -0
  48. package/bin/utils/mcp-detect.test.js +105 -0
  49. package/bin/utils/pbix.js +305 -0
  50. package/bin/utils/pbix.test.js +37 -0
  51. package/bin/utils/profiles.js +312 -0
  52. package/bin/utils/projects.js +168 -0
  53. package/bin/utils/readline.js +206 -0
  54. package/bin/utils/readline.test.js +47 -0
  55. package/bin/utils/tui.js +314 -0
  56. package/bin/utils/tui.test.js +127 -0
  57. package/commands/contributions.md +265 -0
  58. package/commands/data-model-design.md +468 -0
  59. package/commands/dax-doctor.md +248 -0
  60. package/commands/fabric-scripts.md +452 -0
  61. package/commands/migration-assistant.md +290 -0
  62. package/commands/model-documenter.md +242 -0
  63. package/commands/pbi-connect.md +239 -0
  64. package/commands/project-kickoff.md +905 -0
  65. package/commands/report-layout.md +296 -0
  66. package/commands/rls-design.md +533 -0
  67. package/commands/theme-tweaker.md +624 -0
  68. package/config.example.json +23 -0
  69. package/config.json +23 -0
  70. package/desktop-extension/manifest.json +37 -0
  71. package/desktop-extension/package.json +10 -0
  72. package/desktop-extension/server.js +95 -0
  73. package/docs/openrouter-free-models.md +92 -0
  74. package/library/examples/README.md +151 -0
  75. package/library/examples/finance-reporting/README.md +351 -0
  76. package/library/examples/finance-reporting/data-model.md +267 -0
  77. package/library/examples/finance-reporting/measures.dax +557 -0
  78. package/library/examples/hr-analytics/README.md +371 -0
  79. package/library/examples/hr-analytics/data-model.md +315 -0
  80. package/library/examples/hr-analytics/measures.dax +460 -0
  81. package/library/examples/marketing-analytics/README.md +37 -0
  82. package/library/examples/marketing-analytics/data-model.md +62 -0
  83. package/library/examples/marketing-analytics/measures.dax +110 -0
  84. package/library/examples/retail-analytics/README.md +439 -0
  85. package/library/examples/retail-analytics/data-model.md +288 -0
  86. package/library/examples/retail-analytics/measures.dax +481 -0
  87. package/library/examples/supply-chain/README.md +37 -0
  88. package/library/examples/supply-chain/data-model.md +69 -0
  89. package/library/examples/supply-chain/measures.dax +77 -0
  90. package/library/examples/udf-library/README.md +228 -0
  91. package/library/examples/udf-library/functions.dax +571 -0
  92. package/library/snippets/dax/README.md +292 -0
  93. package/library/snippets/dax/business-domains.md +576 -0
  94. package/library/snippets/dax/calculate-patterns.md +276 -0
  95. package/library/snippets/dax/calculation-groups.md +489 -0
  96. package/library/snippets/dax/error-handling.md +495 -0
  97. package/library/snippets/dax/iterators-and-aggregations.md +474 -0
  98. package/library/snippets/dax/kpis-and-metrics.md +293 -0
  99. package/library/snippets/dax/rankings-and-topn.md +235 -0
  100. package/library/snippets/dax/security-patterns.md +413 -0
  101. package/library/snippets/dax/text-and-formatting.md +316 -0
  102. package/library/snippets/dax/time-intelligence.md +196 -0
  103. package/library/snippets/dax/user-defined-functions.md +477 -0
  104. package/library/snippets/dax/virtual-tables.md +546 -0
  105. package/library/snippets/excel-formulas/README.md +84 -0
  106. package/library/snippets/excel-formulas/aggregations.md +330 -0
  107. package/library/snippets/excel-formulas/dates-and-times.md +361 -0
  108. package/library/snippets/excel-formulas/dynamic-arrays.md +314 -0
  109. package/library/snippets/excel-formulas/lookups.md +169 -0
  110. package/library/snippets/excel-formulas/text-functions.md +363 -0
  111. package/library/snippets/governance/naming-conventions.md +97 -0
  112. package/library/snippets/governance/review-checklists.md +107 -0
  113. package/library/snippets/power-query/README.md +389 -0
  114. package/library/snippets/power-query/api-integration.md +707 -0
  115. package/library/snippets/power-query/connections.md +434 -0
  116. package/library/snippets/power-query/data-cleaning.md +298 -0
  117. package/library/snippets/power-query/error-handling.md +526 -0
  118. package/library/snippets/power-query/parameters.md +350 -0
  119. package/library/snippets/power-query/performance.md +506 -0
  120. package/library/snippets/power-query/transformations.md +330 -0
  121. package/library/snippets/report-design/accessibility.md +78 -0
  122. package/library/snippets/report-design/chart-selection.md +54 -0
  123. package/library/snippets/report-design/layout-patterns.md +87 -0
  124. package/library/templates/data-models/README.md +93 -0
  125. package/library/templates/data-models/finance-model.md +627 -0
  126. package/library/templates/data-models/retail-star-schema.md +473 -0
  127. package/library/templates/excel/README.md +83 -0
  128. package/library/templates/excel/budget-tracker.md +432 -0
  129. package/library/templates/excel/data-entry-form.md +533 -0
  130. package/library/templates/power-bi/README.md +72 -0
  131. package/library/templates/power-bi/finance-report.md +449 -0
  132. package/library/templates/power-bi/kpi-scorecard.md +461 -0
  133. package/library/templates/power-bi/sales-dashboard.md +281 -0
  134. package/library/themes/excel/README.md +436 -0
  135. package/library/themes/power-bi/README.md +271 -0
  136. package/library/themes/power-bi/accessible.json +307 -0
  137. package/library/themes/power-bi/bi-superpowers-default.json +858 -0
  138. package/library/themes/power-bi/corporate-blue.json +291 -0
  139. package/library/themes/power-bi/dark-mode.json +291 -0
  140. package/library/themes/power-bi/minimal.json +292 -0
  141. package/library/themes/power-bi/print-friendly.json +309 -0
  142. package/package.json +93 -0
  143. package/skills/contributions/SKILL.md +267 -0
  144. package/skills/data-model-design/SKILL.md +470 -0
  145. package/skills/data-modeling/SKILL.md +254 -0
  146. package/skills/data-quality/SKILL.md +664 -0
  147. package/skills/dax/SKILL.md +708 -0
  148. package/skills/dax-doctor/SKILL.md +250 -0
  149. package/skills/dax-udf/SKILL.md +489 -0
  150. package/skills/deployment/SKILL.md +320 -0
  151. package/skills/excel-formulas/SKILL.md +463 -0
  152. package/skills/fabric-scripts/SKILL.md +454 -0
  153. package/skills/fast-standard/SKILL.md +509 -0
  154. package/skills/governance/SKILL.md +205 -0
  155. package/skills/migration-assistant/SKILL.md +292 -0
  156. package/skills/model-documenter/SKILL.md +244 -0
  157. package/skills/pbi-connect/SKILL.md +241 -0
  158. package/skills/power-query/SKILL.md +406 -0
  159. package/skills/project-kickoff/SKILL.md +907 -0
  160. package/skills/query-performance/SKILL.md +480 -0
  161. package/skills/report-design/SKILL.md +207 -0
  162. package/skills/report-layout/SKILL.md +298 -0
  163. package/skills/rls-design/SKILL.md +535 -0
  164. package/skills/semantic-model/SKILL.md +237 -0
  165. package/skills/testing-validation/SKILL.md +643 -0
  166. package/skills/theme-tweaker/SKILL.md +626 -0
  167. package/src/content/base.md +237 -0
  168. package/src/content/mcp-requirements.json +69 -0
  169. package/src/content/routing.md +203 -0
  170. package/src/content/skills/contributions.md +259 -0
  171. package/src/content/skills/data-model-design.md +462 -0
  172. package/src/content/skills/data-modeling.md +246 -0
  173. package/src/content/skills/data-quality.md +656 -0
  174. package/src/content/skills/dax-doctor.md +242 -0
  175. package/src/content/skills/dax-udf.md +481 -0
  176. package/src/content/skills/dax.md +700 -0
  177. package/src/content/skills/deployment.md +312 -0
  178. package/src/content/skills/excel-formulas.md +455 -0
  179. package/src/content/skills/fabric-scripts.md +446 -0
  180. package/src/content/skills/fast-standard.md +501 -0
  181. package/src/content/skills/governance.md +197 -0
  182. package/src/content/skills/migration-assistant.md +284 -0
  183. package/src/content/skills/model-documenter.md +236 -0
  184. package/src/content/skills/pbi-connect.md +233 -0
  185. package/src/content/skills/power-query.md +398 -0
  186. package/src/content/skills/project-kickoff.md +899 -0
  187. package/src/content/skills/query-performance.md +472 -0
  188. package/src/content/skills/report-design.md +199 -0
  189. package/src/content/skills/report-layout.md +290 -0
  190. package/src/content/skills/rls-design.md +527 -0
  191. package/src/content/skills/semantic-model.md +229 -0
  192. package/src/content/skills/testing-validation.md +635 -0
  193. package/src/content/skills/theme-tweaker.md +618 -0
@@ -0,0 +1,288 @@
1
+ # Retail Analytics - Data Model
2
+
3
+ Complete table definitions for the retail analytics star schema.
4
+
5
+ ---
6
+
7
+ ## Fact Table
8
+
9
+ ### FactSales
10
+
11
+ | Column | Data Type | Description |
12
+ |--------|-----------|-------------|
13
+ | SalesKey | Text | Surrogate primary key |
14
+ | DateKey | Text | FK to DimDate (YYYYMMDD format) |
15
+ | ProductKey | Integer | FK to DimProduct |
16
+ | CustomerKey | Integer | FK to DimCustomer |
17
+ | StoreKey | Integer | FK to DimStore |
18
+ | Quantity | Integer | Units sold |
19
+ | UnitPrice | Currency | Sale price per unit |
20
+ | Discount | Currency | Discount amount applied |
21
+ | Amount | Currency | Net sale amount (Qty × Price - Discount) |
22
+ | Cost | Currency | Total cost (Qty × UnitCost) |
23
+
24
+ **Relationships:**
25
+ - FactSales[DateKey] → DimDate[DateKey] (Many:1)
26
+ - FactSales[ProductKey] → DimProduct[ProductKey] (Many:1)
27
+ - FactSales[CustomerKey] → DimCustomer[CustomerKey] (Many:1)
28
+ - FactSales[StoreKey] → DimStore[StoreKey] (Many:1)
29
+
30
+ ---
31
+
32
+ ## Dimension Tables
33
+
34
+ ### DimDate
35
+
36
+ | Column | Data Type | Description | Example |
37
+ |--------|-----------|-------------|---------|
38
+ | DateKey | Text | Primary key (YYYYMMDD) | "20240115" |
39
+ | Date | Date | Full date | 2024-01-15 |
40
+ | Year | Integer | Calendar year | 2024 |
41
+ | Quarter | Text | Quarter label | "Q1" |
42
+ | QuarterNumber | Integer | Quarter number | 1 |
43
+ | Month | Integer | Month number | 1 |
44
+ | MonthName | Text | Full month name | "January" |
45
+ | MonthShort | Text | 3-letter month | "Jan" |
46
+ | YearMonth | Text | Year-Month label | "2024-01" |
47
+ | Week | Integer | Week of year | 3 |
48
+ | WeekOfMonth | Integer | Week of month | 3 |
49
+ | Day | Integer | Day of month | 15 |
50
+ | DayOfWeek | Integer | Day of week (1=Mon) | 1 |
51
+ | DayOfWeekName | Text | Day name | "Monday" |
52
+ | IsWeekend | Boolean | Weekend flag | FALSE |
53
+ | IsHoliday | Boolean | Holiday flag | FALSE |
54
+ | FiscalYear | Integer | Fiscal year | 2024 |
55
+ | FiscalQuarter | Text | Fiscal quarter | "FQ1" |
56
+ | FiscalMonth | Integer | Fiscal month | 7 |
57
+
58
+ **Settings:**
59
+ - Mark as Date Table using Date column
60
+ - Sort MonthName by Month
61
+ - Sort DayOfWeekName by DayOfWeek
62
+
63
+ ---
64
+
65
+ ### DimProduct
66
+
67
+ | Column | Data Type | Description | Example |
68
+ |--------|-----------|-------------|---------|
69
+ | ProductKey | Integer | Surrogate PK | 1001 |
70
+ | ProductID | Text | Business key | "SKU-12345" |
71
+ | ProductName | Text | Product name | "Wireless Mouse" |
72
+ | Category | Text | Top-level category | "Electronics" |
73
+ | SubCategory | Text | Sub-category | "Accessories" |
74
+ | Brand | Text | Brand name | "TechBrand" |
75
+ | UnitCost | Currency | Cost to company | 12.50 |
76
+ | UnitPrice | Currency | List price | 24.99 |
77
+ | Margin | Decimal | Calculated margin | 0.50 |
78
+ | IsActive | Boolean | Currently sold | TRUE |
79
+ | LaunchDate | Date | Product launch | 2023-06-01 |
80
+
81
+ **Hierarchies:**
82
+ - Category > SubCategory > ProductName
83
+ - Brand > ProductName
84
+
85
+ ---
86
+
87
+ ### DimCustomer
88
+
89
+ | Column | Data Type | Description | Example |
90
+ |--------|-----------|-------------|---------|
91
+ | CustomerKey | Integer | Surrogate PK | 5001 |
92
+ | CustomerID | Text | Business key | "CUST-12345" |
93
+ | CustomerName | Text | Full name | "John Smith" |
94
+ | Email | Text | Email address | "john@example.com" |
95
+ | Phone | Text | Phone number | "555-0100" |
96
+ | Address | Text | Street address | "123 Main St" |
97
+ | City | Text | City | "Seattle" |
98
+ | State | Text | State code | "WA" |
99
+ | PostalCode | Text | ZIP code | "98101" |
100
+ | Region | Text | Sales region | "West" |
101
+ | Country | Text | Country | "USA" |
102
+ | JoinDate | Date | Customer since | 2022-03-15 |
103
+ | Tier | Text | Customer tier | "Gold" |
104
+ | IsActive | Boolean | Active customer | TRUE |
105
+
106
+ **Hierarchies:**
107
+ - Region > State > City
108
+ - Tier > CustomerName
109
+
110
+ ---
111
+
112
+ ### DimStore
113
+
114
+ | Column | Data Type | Description | Example |
115
+ |--------|-----------|-------------|---------|
116
+ | StoreKey | Integer | Surrogate PK | 101 |
117
+ | StoreID | Text | Business key | "STORE-001" |
118
+ | StoreName | Text | Store name | "Downtown Seattle" |
119
+ | StoreType | Text | Store type | "Flagship" |
120
+ | Address | Text | Street address | "100 Pike St" |
121
+ | City | Text | City | "Seattle" |
122
+ | State | Text | State code | "WA" |
123
+ | PostalCode | Text | ZIP code | "98101" |
124
+ | Region | Text | Sales region | "West" |
125
+ | Country | Text | Country | "USA" |
126
+ | Latitude | Decimal | Latitude | 47.6062 |
127
+ | Longitude | Decimal | Longitude | -122.3321 |
128
+ | OpenDate | Date | Store opened | 2020-01-15 |
129
+ | SquareFeet | Integer | Floor space | 25000 |
130
+ | EmployeeCount | Integer | Staff count | 45 |
131
+ | Manager | Text | Manager name | "Jane Doe" |
132
+ | IsActive | Boolean | Currently open | TRUE |
133
+
134
+ **Hierarchies:**
135
+ - Region > State > City > StoreName
136
+ - StoreType > StoreName
137
+
138
+ ---
139
+
140
+ ## Calculated Columns
141
+
142
+ ### DimDate - Date Table Generation
143
+
144
+ ```m
145
+ // Power Query for DimDate
146
+ let
147
+ StartDate = #date(2020, 1, 1),
148
+ EndDate = #date(2026, 12, 31),
149
+ DateList = List.Dates(StartDate, Duration.Days(EndDate - StartDate) + 1, #duration(1, 0, 0, 0)),
150
+ DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
151
+
152
+ // Add columns
153
+ WithColumns = Table.AddColumn(
154
+ Table.AddColumn(
155
+ Table.AddColumn(
156
+ Table.AddColumn(
157
+ Table.AddColumn(
158
+ Table.AddColumn(
159
+ Table.TransformColumnTypes(DateTable, {{"Date", type date}}),
160
+ "DateKey", each Date.ToText([Date], "yyyyMMdd"), type text
161
+ ),
162
+ "Year", each Date.Year([Date]), Int64.Type
163
+ ),
164
+ "Month", each Date.Month([Date]), Int64.Type
165
+ ),
166
+ "MonthName", each Date.MonthName([Date]), type text
167
+ ),
168
+ "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text
169
+ ),
170
+ "DayOfWeek", each Date.DayOfWeek([Date], Day.Monday) + 1, Int64.Type
171
+ ),
172
+
173
+ // Add more columns
174
+ WithMoreColumns = Table.AddColumn(
175
+ Table.AddColumn(
176
+ Table.AddColumn(WithColumns,
177
+ "IsWeekend", each Date.DayOfWeek([Date], Day.Monday) >= 5, type logical
178
+ ),
179
+ "YearMonth", each Date.ToText([Date], "yyyy-MM"), type text
180
+ ),
181
+ "Week", each Date.WeekOfYear([Date]), Int64.Type
182
+ )
183
+ in
184
+ WithMoreColumns
185
+ ```
186
+
187
+ ### DimProduct - Margin Calculation
188
+
189
+ ```dax
190
+ // DAX Calculated Column
191
+ Margin =
192
+ DIVIDE(
193
+ DimProduct[UnitPrice] - DimProduct[UnitCost],
194
+ DimProduct[UnitPrice]
195
+ )
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Relationship Diagram
201
+
202
+ ```
203
+ DimDate[DateKey] ─────────────────────────────┐
204
+
205
+ DimProduct[ProductKey] ────────────────────┐ │
206
+ │ │
207
+ DimCustomer[CustomerKey] ────────────────┐ │ │
208
+ │ │ │
209
+ DimStore[StoreKey] ────────────────────┐ │ │ │
210
+ │ │ │ │
211
+ ▼ ▼ ▼ ▼
212
+ ┌───────────┐
213
+ │ FactSales │
214
+ └───────────┘
215
+
216
+ All relationships: Many-to-One, Single direction (Dimension → Fact)
217
+ Cross-filter direction: Single (except DimDate which may be Both for some scenarios)
218
+ ```
219
+
220
+ ---
221
+
222
+ ## Model Settings
223
+
224
+ ### Table Properties
225
+
226
+ | Table | Load to Report | Include in Refresh |
227
+ |-------|----------------|-------------------|
228
+ | FactSales | Yes | Yes |
229
+ | DimDate | Yes | Yes (or No if static) |
230
+ | DimProduct | Yes | Yes |
231
+ | DimCustomer | Yes | Yes |
232
+ | DimStore | Yes | Yes |
233
+
234
+ ### Hidden Columns
235
+
236
+ Hide these columns from report view (they're for relationships only):
237
+
238
+ - FactSales[DateKey]
239
+ - FactSales[ProductKey]
240
+ - FactSales[CustomerKey]
241
+ - FactSales[StoreKey]
242
+ - All surrogate key columns (except for debugging)
243
+
244
+ ### Data Categories
245
+
246
+ | Column | Data Category |
247
+ |--------|---------------|
248
+ | DimCustomer[City] | City |
249
+ | DimCustomer[State] | State or Province |
250
+ | DimCustomer[PostalCode] | Postal Code |
251
+ | DimCustomer[Country] | Country |
252
+ | DimStore[City] | City |
253
+ | DimStore[State] | State or Province |
254
+ | DimStore[Latitude] | Latitude |
255
+ | DimStore[Longitude] | Longitude |
256
+ | DimProduct[ProductName] | Uncategorized |
257
+
258
+ ---
259
+
260
+ ## Sample Data
261
+
262
+ ### FactSales (5 rows)
263
+
264
+ | SalesKey | DateKey | ProductKey | CustomerKey | StoreKey | Quantity | UnitPrice | Discount | Amount |
265
+ |----------|---------|------------|-------------|----------|----------|-----------|----------|--------|
266
+ | S001 | 20240115 | 1001 | 5001 | 101 | 2 | 24.99 | 0.00 | 49.98 |
267
+ | S002 | 20240115 | 1002 | 5002 | 101 | 1 | 149.99 | 15.00 | 134.99 |
268
+ | S003 | 20240116 | 1001 | 5003 | 102 | 3 | 24.99 | 5.00 | 69.97 |
269
+ | S004 | 20240116 | 1003 | 5001 | 101 | 1 | 599.99 | 0.00 | 599.99 |
270
+ | S005 | 20240117 | 1002 | 5004 | 103 | 2 | 149.99 | 20.00 | 279.98 |
271
+
272
+ ### DimProduct (3 rows)
273
+
274
+ | ProductKey | ProductID | ProductName | Category | SubCategory | Brand | UnitCost | UnitPrice |
275
+ |------------|-----------|-------------|----------|-------------|-------|----------|-----------|
276
+ | 1001 | SKU-001 | Wireless Mouse | Electronics | Accessories | TechBrand | 12.50 | 24.99 |
277
+ | 1002 | SKU-002 | Bluetooth Headphones | Electronics | Audio | SoundMax | 45.00 | 149.99 |
278
+ | 1003 | SKU-003 | Gaming Monitor | Electronics | Displays | ViewPro | 280.00 | 599.99 |
279
+
280
+ ---
281
+
282
+ ## Performance Tips
283
+
284
+ 1. **Use surrogate keys** - Integer keys are faster for joins
285
+ 2. **Avoid high-cardinality columns** in slicers
286
+ 3. **Use aggregations** for large fact tables (1M+ rows)
287
+ 4. **Partition** by date for incremental refresh
288
+ 5. **Set data types** correctly - don't use text for numbers