@kerfjs/ui 5.0.0-beta.18 → 5.0.0-beta.22

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 (170) hide show
  1. package/README.md +114 -3
  2. package/ai/application-ui-diagnostic-ids-v1.json +92 -0
  3. package/ai/application-ui-profile-sync.cjs +529 -0
  4. package/ai/application-ui-profile.d.mts +1 -0
  5. package/ai/application-ui-profile.d.ts +102 -0
  6. package/ai/application-ui-profile.defaults.json +41 -0
  7. package/ai/application-ui-profile.mjs +626 -0
  8. package/ai/application-ui-profile.schema.json +130 -0
  9. package/ai/catalog-authoring.json +25 -0
  10. package/ai/catalog-authoring.schema.json +61 -0
  11. package/ai/compile-time-contracts-v1.json +101 -0
  12. package/ai/compile-time-contracts-v1.schema.json +49 -0
  13. package/ai/component-catalog-extension-v2.d.ts +7 -0
  14. package/ai/component-catalog-extension-v2.schema.json +7 -0
  15. package/ai/component-catalog-v2-overrides.json +326 -0
  16. package/ai/component-catalog-v2.d.ts +67 -0
  17. package/ai/component-catalog-v2.json +4441 -0
  18. package/ai/component-catalog-v2.schema.json +246 -0
  19. package/ai/component-catalog.json +150 -6
  20. package/ai/public-api-signatures-v1.md +294 -64
  21. package/ai/skill.md +41 -5
  22. package/ai/webawesome-jsx-signatures-v1.md +1 -1
  23. package/analyzer/cli.mjs +46 -0
  24. package/analyzer/index.d.mts +45 -0
  25. package/analyzer/index.mjs +743 -0
  26. package/analyzer/report.schema.json +66 -0
  27. package/dist/browser/pane.js +3 -0
  28. package/dist/browser/sunken-panel.js +3 -0
  29. package/dist/catalog-resources.d.ts +34 -0
  30. package/dist/catalog-resources.js +22 -0
  31. package/dist/catalog-resources.js.map +1 -0
  32. package/dist/catalog.d.ts +21 -3
  33. package/dist/catalog.js +239 -210
  34. package/dist/catalog.js.map +1 -1
  35. package/dist/{chunk-ZK2G3VR5.js → chunk-5VTB2BKP.js} +1 -1
  36. package/dist/chunk-5VTB2BKP.js.map +1 -0
  37. package/dist/{chunk-S3HKPI7I.js → chunk-7KEUJIIC.js} +1 -1
  38. package/dist/chunk-7KEUJIIC.js.map +1 -0
  39. package/dist/{chunk-NVWXKU37.js → chunk-AASLYRGE.js} +1 -1
  40. package/dist/chunk-AASLYRGE.js.map +1 -0
  41. package/dist/{chunk-QIRXYKCE.js → chunk-DSNIYOZ3.js} +3 -2
  42. package/dist/chunk-DSNIYOZ3.js.map +1 -0
  43. package/dist/{chunk-ENVTNLYC.js → chunk-GP5DP5DL.js} +55 -15
  44. package/dist/chunk-GP5DP5DL.js.map +1 -0
  45. package/dist/chunk-JRKSK2HX.js +79 -0
  46. package/dist/chunk-JRKSK2HX.js.map +1 -0
  47. package/dist/{chunk-U5IFGQCD.js → chunk-K57KRAOV.js} +1 -1
  48. package/dist/chunk-K57KRAOV.js.map +1 -0
  49. package/dist/{chunk-ZVI5YST2.js → chunk-M7JBER5U.js} +1 -1
  50. package/dist/chunk-M7JBER5U.js.map +1 -0
  51. package/dist/{chunk-43FUQH35.js → chunk-OHU6CI22.js} +2 -2
  52. package/dist/{chunk-43FUQH35.js.map → chunk-OHU6CI22.js.map} +1 -1
  53. package/dist/{chunk-4TRDV6RL.js → chunk-OZWU5ZPZ.js} +1 -1
  54. package/dist/chunk-OZWU5ZPZ.js.map +1 -0
  55. package/dist/{chunk-JTHUXDN2.js → chunk-RYRIFZCT.js} +3 -3
  56. package/dist/chunk-RYRIFZCT.js.map +1 -0
  57. package/dist/{chunk-6ETZKKAE.js → chunk-VLYV65LK.js} +1 -1
  58. package/dist/chunk-VLYV65LK.js.map +1 -0
  59. package/dist/chunk-W4CXQYSG.js +23 -0
  60. package/dist/chunk-W4CXQYSG.js.map +1 -0
  61. package/dist/{chunk-S3PCZ7NV.js → chunk-W7YD6E4N.js} +1 -1
  62. package/dist/chunk-W7YD6E4N.js.map +1 -0
  63. package/dist/index.d.ts +6 -4
  64. package/dist/index.js +14 -12
  65. package/dist/list-header.d.ts +29 -8
  66. package/dist/list-header.js +1 -1
  67. package/dist/nav-stack.js +1 -1
  68. package/dist/pane.d.ts +49 -0
  69. package/dist/pane.js +4 -0
  70. package/dist/pane.js.map +1 -0
  71. package/dist/panel-header.d.ts +9 -3
  72. package/dist/panel-header.js +1 -1
  73. package/dist/segmented-control.d.ts +6 -6
  74. package/dist/segmented-control.js +1 -1
  75. package/dist/select.d.ts +10 -4
  76. package/dist/select.js +1 -1
  77. package/dist/split-view.js +2 -2
  78. package/dist/state-banner.d.ts +3 -2
  79. package/dist/state-banner.js +1 -1
  80. package/dist/styles/catalog.css +6 -6
  81. package/dist/styles/layout.css +2 -20
  82. package/dist/styles/pane.css +62 -0
  83. package/dist/styles/segmented-control.css +3 -7
  84. package/dist/styles/sunken-panel.css +18 -0
  85. package/dist/sunken-panel.d.ts +16 -0
  86. package/dist/sunken-panel.js +3 -0
  87. package/dist/sunken-panel.js.map +1 -0
  88. package/dist/tab-bar.d.ts +3 -2
  89. package/dist/tab-bar.js +1 -1
  90. package/dist/tab-scaffold.d.ts +6 -6
  91. package/dist/tab-scaffold.js.map +1 -1
  92. package/dist/token-search-field.d.ts +25 -9
  93. package/dist/token-search-field.js +1 -1
  94. package/dist/toolbar-control-group.d.ts +9 -5
  95. package/dist/toolbar-control-group.js +1 -1
  96. package/dist/toolbar-text.d.ts +10 -11
  97. package/dist/toolbar-text.js +1 -1
  98. package/dist/wire-tab-bars.d.ts +5 -2
  99. package/dist/wire-tab-bars.js +1 -1
  100. package/dist/wire-token-search-fields.d.ts +11 -6
  101. package/dist/wire-token-search-fields.js +1 -1
  102. package/docs/catalog.md +186 -67
  103. package/docs/component-contract.md +102 -5
  104. package/docs/component-selection.md +9 -5
  105. package/docs/design/templates/panel-header/icon-actions-dark.svg +1 -1
  106. package/docs/design/templates/panel-header/icon-actions.svg +1 -1
  107. package/docs/design/templates/panel-header/icon-summary-actions-dark.svg +1 -1
  108. package/docs/design/templates/panel-header/icon-summary-actions.svg +1 -1
  109. package/docs/design/templates/panel-header/no-icon-dark.svg +1 -1
  110. package/docs/design/templates/panel-header/no-icon.svg +1 -1
  111. package/docs/design/templates/panel-header/page-heading-dark.svg +1 -1
  112. package/docs/design/templates/panel-header/page-heading.svg +1 -1
  113. package/docs/design/templates/panel-header/title-only-dark.svg +1 -1
  114. package/docs/design/templates/panel-header/title-only.svg +1 -1
  115. package/docs/design/templates/panel-header-dark.svg +5 -5
  116. package/docs/design/templates/panel-header.svg +5 -5
  117. package/docs/design/templates/segmented-control/equal-dark.svg +1 -1
  118. package/docs/design/templates/segmented-control/equal.svg +1 -1
  119. package/docs/design/templates/segmented-control-dark.svg +1 -1
  120. package/docs/design/templates/segmented-control.svg +1 -1
  121. package/docs/design/templates/toolbar/title-and-actions-dark.svg +1 -1
  122. package/docs/design/templates/toolbar/title-and-actions.svg +1 -1
  123. package/docs/design/templates/toolbar-control-group/with-text-dark.svg +1 -1
  124. package/docs/design/templates/toolbar-control-group/with-text.svg +1 -1
  125. package/docs/design/templates/toolbar-control-group-dark.svg +1 -1
  126. package/docs/design/templates/toolbar-control-group.svg +1 -1
  127. package/docs/design/templates/toolbar-dark.svg +1 -1
  128. package/docs/design/templates/toolbar-text/default-dark.svg +1 -1
  129. package/docs/design/templates/toolbar-text/default.svg +1 -1
  130. package/docs/design/templates/toolbar-text/large-dark.svg +1 -1
  131. package/docs/design/templates/toolbar-text/large.svg +1 -1
  132. package/docs/design/templates/toolbar-text/small-dark.svg +1 -1
  133. package/docs/design/templates/toolbar-text/small.svg +1 -1
  134. package/docs/design/templates/toolbar-text-dark.svg +3 -3
  135. package/docs/design/templates/toolbar-text.svg +3 -3
  136. package/docs/design/templates/toolbar.svg +1 -1
  137. package/docs/design/templates.md +11 -6
  138. package/docs/design-philosophy.md +2 -4
  139. package/docs/examples/application-ui-profile.json +60 -0
  140. package/docs/examples/component-catalog-extension-v2.json +81 -0
  141. package/docs/layout.md +42 -23
  142. package/docs/sunken-panel.md +43 -0
  143. package/docs/type-contracts.md +99 -0
  144. package/docs/ui-analyzer.md +81 -0
  145. package/docs/ui-doctor.md +77 -0
  146. package/docs/ui-evaluator.md +122 -0
  147. package/doctor/cli.mjs +115 -0
  148. package/doctor/config.schema.json +68 -0
  149. package/doctor/index.d.mts +116 -0
  150. package/doctor/index.mjs +1256 -0
  151. package/doctor/report.schema.json +118 -0
  152. package/evaluator/cli.mjs +89 -0
  153. package/evaluator/index.d.mts +90 -0
  154. package/evaluator/index.mjs +1138 -0
  155. package/evaluator/report.schema.json +152 -0
  156. package/llms.txt +40 -3
  157. package/package.json +66 -8
  158. package/ux-demo/recipes/compact-toolbar.tsx +2 -2
  159. package/ux-demo/recipes/composer-form.tsx +1 -1
  160. package/dist/chunk-4TRDV6RL.js.map +0 -1
  161. package/dist/chunk-6ETZKKAE.js.map +0 -1
  162. package/dist/chunk-ENVTNLYC.js.map +0 -1
  163. package/dist/chunk-JTHUXDN2.js.map +0 -1
  164. package/dist/chunk-NVWXKU37.js.map +0 -1
  165. package/dist/chunk-QIRXYKCE.js.map +0 -1
  166. package/dist/chunk-S3HKPI7I.js.map +0 -1
  167. package/dist/chunk-S3PCZ7NV.js.map +0 -1
  168. package/dist/chunk-U5IFGQCD.js.map +0 -1
  169. package/dist/chunk-ZK2G3VR5.js.map +0 -1
  170. package/dist/chunk-ZVI5YST2.js.map +0 -1
package/README.md CHANGED
@@ -4,6 +4,13 @@ Accessible, composable UI primitives for [kerf](https://github.com/brianwestphal
4
4
 
5
5
  Start interface work with the [need-first component selection matrix](./docs/component-selection.md). It distinguishes direct reuse, composition, thin application adapters, and genuinely custom semantics, with imports, required wiring, application ownership, alternatives, and recipes for every public primitive.
6
6
 
7
+ When authoring a component gallery, follow the single
8
+ [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract)
9
+ for focused-versus-composition modes, helper nesting, specimen selection,
10
+ geometry inspection, and metadata ownership. AI tools can discover that
11
+ contract and its public imports through the shipped
12
+ [`catalog-authoring.json`](./ai/catalog-authoring.json) artifact.
13
+
7
14
  For connective application patterns, use the seven [production composition
8
15
  recipes](./docs/recipes.md). Each has a stable catalog route, runnable state,
9
16
  public-subpath source, semantic layout ownership, and explicit application
@@ -81,12 +88,13 @@ mount(root, () => (
81
88
  Components return Kerf `SafeHtml`. They do not own application state or attach transient listeners. Actions are stable `data-action` hooks; the application wires them once with `delegate()` or `delegateActions()` and retains the disposer.
82
89
 
83
90
  `ListItem.rootAttributes`, `ListHeader.rootAttributes`,
84
- `ListActionRow.rootAttributes`, and `AppTab.rootAttributes` carry typed
91
+ `ListActionRow.rootAttributes`, `AppTab.rootAttributes`,
92
+ `CatalogExample.rootAttributes`, and `CatalogExampleStack.rootAttributes` carry typed
85
93
  application `data-*` metadata without
86
94
  teaching the package domain fields. `ListHeader.triggerAttributes` and
87
95
  `ListActionRow.trailingActionAttributes` additionally support native popover
88
96
  target and relationship attributes. Roles and component-owned action, selection,
89
- disclosure, naming, disabled, and icon semantics remain protected props; an
97
+ disclosure, naming, disabled, icon, and catalog-structure semantics remain protected props; an
90
98
  isolated `role="menuitem"` is not an extension shortcut.
91
99
  The slots are also filtered at runtime, so structurally widened objects and
92
100
  JavaScript callers cannot bypass those protections with case-variant names.
@@ -119,7 +127,8 @@ as a `New` marker.
119
127
  | `ListHeader` | `@kerfjs/ui/list-header` | `@kerfjs/ui/list-header.css` |
120
128
  | `ListInsetControl` | `@kerfjs/ui/list-inset-control` | `@kerfjs/ui/list-inset-control.css` |
121
129
  | `ListInsetText` | `@kerfjs/ui/list-inset-text` | `@kerfjs/ui/list-inset-text.css` |
122
- | Pane, content, and navigation composition | | `@kerfjs/ui/layout.css` |
130
+ | `Pane` | `@kerfjs/ui/pane` | `@kerfjs/ui/pane.css` |
131
+ | Content and navigation composition | — | `@kerfjs/ui/layout.css` |
123
132
  | `ResizableRegion` | `@kerfjs/ui/resizable-region` | `@kerfjs/ui/resizable-region.css` |
124
133
  | `wireResizableRegions` | `@kerfjs/ui/wire-resizable-regions` | — |
125
134
  | `AppTab` | `@kerfjs/ui/app-tab` | `@kerfjs/ui/app-tab.css` |
@@ -127,6 +136,7 @@ as a `New` marker.
127
136
  | `wireTabBars`, `reorderTabs` | `@kerfjs/ui/wire-tab-bars` | — |
128
137
  | `LoadingSpinner` | `@kerfjs/ui/loading-spinner` | `@kerfjs/ui/loading-spinner.css` |
129
138
  | `Skeleton` | `@kerfjs/ui/skeleton` | `@kerfjs/ui/skeleton.css` |
139
+ | `SunkenPanel` | `@kerfjs/ui/sunken-panel` | `@kerfjs/ui/sunken-panel.css` |
130
140
  | `Select` | `@kerfjs/ui/select` | `@kerfjs/ui/select.css` |
131
141
  | `SegmentedControl` | `@kerfjs/ui/segmented-control` | `@kerfjs/ui/segmented-control.css` |
132
142
  | `TokenSearchField`, `readTokenSearchField`, `placeTokenSearchCaret` | `@kerfjs/ui/token-search-field` | `@kerfjs/ui/token-search-field.css` |
@@ -174,6 +184,24 @@ the versioned format. Every visual entry also declares who owns its margin,
174
184
  border, and padding, so a generator can fit it into Kerf's alignment model
175
185
  without guessing from a screenshot or private CSS.
176
186
 
187
+ Catalog demo authoring is deliberately separate from the entry inventory. Load
188
+ [`catalog-authoring.json`](./ai/catalog-authoring.json) to discover the
189
+ authoritative [Catalog demo authoring contract](./docs/catalog.md#catalog-demo-authoring-contract),
190
+ the exact API-signature context, public imports/helpers, and sanctioned metadata
191
+ slot. Keeping this as a companion artifact prevents per-entry selection facts
192
+ from duplicating presentation rules.
193
+
194
+ Tools that evaluate composition may additionally load
195
+ [`component-catalog-v2.json`](./ai/component-catalog-v2.json). It is a
196
+ deterministic, package-qualified projection of every v1 entry with formal
197
+ parent/context, zone/cardinality, child, state ownership, wiring, responsive,
198
+ layout, accessibility, public-boundary, and stable-diagnostic fields. V1
199
+ remains the selection and delivery compatibility surface. V2 defaults are
200
+ deliberately permissive; only documented objective rules receive an
201
+ authoritative override and enforceable diagnostic. The adjacent schema and
202
+ [`component-catalog-v2.d.ts`](./ai/component-catalog-v2.d.ts) types describe
203
+ the same contract.
204
+
177
205
  Applications and downstream design systems should publish the same facts for
178
206
  their own components. Start from the reusable
179
207
  [`component-catalog-extension.schema.json`](./ai/component-catalog-extension.schema.json)
@@ -186,6 +214,89 @@ identity alongside each input when ids could collide. This makes a combined
186
214
  tool reason about both sides of a composition using one vocabulary without
187
215
  pretending app-local components are `@kerfjs/ui` exports.
188
216
 
217
+ Composition-aware consumers use
218
+ [`component-catalog-extension-v2.schema.json`](./ai/component-catalog-extension-v2.schema.json),
219
+ its shipped TypeScript types, and the checked
220
+ [`component-catalog-extension-v2.json`](./docs/examples/component-catalog-extension-v2.json)
221
+ example. Preserve each catalog's package and qualify every identity and
222
+ cross-catalog reference as `package:id`; never merge entries by bare id.
223
+
224
+ [`compile-time-contracts-v1.json`](./ai/compile-time-contracts-v1.json) is the
225
+ matching declaration contract: stable `KUI-T###` ids identify the invalid prop,
226
+ state, identity, accessibility, and protected-attribute combinations TypeScript
227
+ rejects. The package gate compiles one positive/negative consumer fixture against
228
+ both source and declarations extracted from the real packed tarball. The
229
+ [compile-time contract guide](./docs/type-contracts.md) documents migrations and
230
+ the dynamic DOM/children relationships that remain runtime or catalog checks.
231
+ Packages scaffolded by `create-kerf-component` maintain this v2 input from
232
+ `kerf.components.json`: `npm run catalog:generate` emits the catalog and
233
+ `npm run catalog:check` verifies source files, named public exports, explicit
234
+ author decisions, and byte-for-byte drift. Tools index the generated consumer
235
+ entries and this catalog by full key, reject duplicate full keys, search the
236
+ consumer package first, and retain package identity across every reference.
237
+ They must not infer missing semantics or geometry from rendered appearance.
238
+
239
+ ### Application UI profile
240
+
241
+ Applications can check in `.kerf-ui-profile.json` so tools do not have to infer
242
+ project-wide UI policy. Start from the shipped
243
+ [`application-ui-profile.defaults.json`](./ai/application-ui-profile.defaults.json)
244
+ and the checked
245
+ [`application-ui-profile.json`](./docs/examples/application-ui-profile.json)
246
+ workspace example. The versioned
247
+ [`application-ui-profile.schema.json`](./ai/application-ui-profile.schema.json)
248
+ and [`application-ui-profile.d.ts`](./ai/application-ui-profile.d.ts) cover
249
+ catalog locations, concept preferences, allowed theme/density choices, semantic
250
+ token overrides, layout/responsive conventions, and narrow rule exceptions.
251
+ Profiles contain policy only—never product records, user data, or broad styling
252
+ waivers.
253
+
254
+ Catalog declarations always provide a v2 `composition` location. Consumer
255
+ packages generated with composition-only metadata omit `selection`;
256
+ `@kerfjs/ui` continues to require its v1 selection catalog.
257
+
258
+ Node-based AI and static-analysis tools may import the shipped discovery API
259
+ from `@kerfjs/ui/ai/application-ui-profile.mjs`. It discovers package defaults,
260
+ then the workspace profile, then directory profiles from parent to child;
261
+ `mergeApplicationUiProfiles()` applies later scalar/map values, replaces a
262
+ catalog by package and an exception by id, and preserves source provenance.
263
+ `loadApplicationUiProfile()` resolves catalogs and returns diagnostics with the
264
+ originating file plus JSON path. Unknown/stale components, tokens, rules, and
265
+ catalog locations are errors. Every layer is checked against its then-effective
266
+ catalogs, including parent references and catalog paths later overridden by a
267
+ child profile. Synchronous integrations can require the shipped
268
+ `application-ui-profile-sync.cjs` projection and call
269
+ `loadApplicationUiProfileSync()` with already-discovered layers. Consumers that define additional stable
270
+ diagnostics pass their ids through the additive `knownRules` option; those ids
271
+ are merged with catalog diagnostics before exception validation.
272
+
273
+ ### Static CSS and layout ownership analysis
274
+
275
+ Run `kerf-ui-analyze --root . src` (or import
276
+ `@kerfjs/ui/analyzer`) to evaluate cross-file integration facts against the
277
+ composition catalogs and application profile. It catches provable private
278
+ selector reach-through, unknown tokens, competing geometry owners, and nested
279
+ scroll owners; it reports forced dimensions, repeated insets, off-scale literal
280
+ spacing, and dynamic classes separately as review findings. Text, versioned JSON,
281
+ and SARIF outputs carry stable `KUI-L###` ids, repository-relative locations,
282
+ evidence, and ownership chains. See the [analyzer guide](./docs/ui-analyzer.md).
283
+
284
+ ### Browser-backed integration evaluation
285
+
286
+ Run `kerf-ui-evaluate --url <running-app>` (or import
287
+ `@kerfjs/ui/evaluator`) after the static analyzer. Its Playwright-backed
288
+ wide/intermediate/narrow/200%-zoom, light/dark, and reduced-motion matrix checks
289
+ rendered overflow, clipping, reachability, focus/keyboard behavior, accessible
290
+ names, contrast, hit targets, scrolling, alignment, and cataloged runtime
291
+ geometry. The versioned report carries stable `KUI-B###` diagnostics, focused
292
+ DOM/computed-style evidence, hashed screenshot artifacts, explicit timeout and
293
+ retention policy, and a separate unscored human-visual rubric. See the
294
+ [browser evaluator guide](./docs/ui-evaluator.md).
295
+
296
+ ### Unified repair-loop doctor
297
+
298
+ Use `kerf-ui-doctor` for the supported application repair loop across profile/catalog validation, TypeScript, the Kerf UI ESLint preset, static layout analysis, and an optional explicitly authorized browser evaluation. It emits one portable versioned JSON report with deterministic exit codes, exact suppressions, monorepo package selection, changed/full modes, caching, and local-path redaction. See the [UI doctor guide](./docs/ui-doctor.md).
299
+
189
300
  For code generation, pair catalog selection guidance with the checked-in
190
301
  [`public-api-signatures-v1.md`](./ai/public-api-signatures-v1.md) declaration
191
302
  snapshot. It is generated from the emitted `@kerfjs/ui` declarations and the
@@ -0,0 +1,92 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "ids": [
4
+ "KUI-B001",
5
+ "KUI-B010",
6
+ "KUI-B011",
7
+ "KUI-B012",
8
+ "KUI-B020",
9
+ "KUI-B021",
10
+ "KUI-B022",
11
+ "KUI-B023",
12
+ "KUI-B030",
13
+ "KUI-B040",
14
+ "KUI-B050",
15
+ "KUI-B060",
16
+ "KUI-B070",
17
+ "KUI-B080",
18
+ "KUI-C101",
19
+ "KUI-C102",
20
+ "KUI-C103",
21
+ "KUI-C104",
22
+ "KUI-C105",
23
+ "KUI-C106",
24
+ "KUI-C107",
25
+ "KUI-C108",
26
+ "KUI-D001",
27
+ "KUI-D002",
28
+ "KUI-D003",
29
+ "KUI-D010",
30
+ "KUI-D011",
31
+ "KUI-D020",
32
+ "KUI-L001",
33
+ "KUI-L002",
34
+ "KUI-L003",
35
+ "KUI-L004",
36
+ "KUI-L005",
37
+ "KUI-L006",
38
+ "KUI-L007",
39
+ "KUI-L008",
40
+ "KUI-L009",
41
+ "KUI-L090",
42
+ "KUI-L101",
43
+ "KUI-L102",
44
+ "KUI-L201",
45
+ "KUI-L202",
46
+ "KUI-L203",
47
+ "KUI-L301",
48
+ "KUI-L401",
49
+ "KUI-L402",
50
+ "KUI-P001",
51
+ "KUI-P002",
52
+ "KUI-P003",
53
+ "KUI-P004",
54
+ "KUI-P005",
55
+ "KUI-P006",
56
+ "KUI-P007",
57
+ "KUI-P008",
58
+ "KUI-P009",
59
+ "KUI-P010",
60
+ "KUI-P011",
61
+ "KUI-P012",
62
+ "KUI-P013",
63
+ "KUI-P014",
64
+ "KUI-P015",
65
+ "KUI-P016",
66
+ "KUI-P017",
67
+ "KUI-P018",
68
+ "KUI-P019",
69
+ "KUI-P020",
70
+ "KUI-P021",
71
+ "KUI-P022",
72
+ "KUI-P023",
73
+ "KUI-P024",
74
+ "KUI-P025",
75
+ "KUI-P026",
76
+ "KUI-P027",
77
+ "KUI-P028",
78
+ "KUI-P029",
79
+ "KUI-P030",
80
+ "KUI-T001",
81
+ "KUI-T002",
82
+ "KUI-T003",
83
+ "KUI-T004",
84
+ "KUI-T005",
85
+ "KUI-T006",
86
+ "KUI-T007",
87
+ "KUI-T008",
88
+ "KUI-T009",
89
+ "KUI-T010",
90
+ "KUI-T011"
91
+ ]
92
+ }