@kerfjs/ui 5.0.0-beta.18 → 5.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +114 -3
- package/ai/application-ui-diagnostic-ids-v1.json +92 -0
- package/ai/application-ui-profile-sync.cjs +529 -0
- package/ai/application-ui-profile.d.mts +1 -0
- package/ai/application-ui-profile.d.ts +102 -0
- package/ai/application-ui-profile.defaults.json +41 -0
- package/ai/application-ui-profile.mjs +626 -0
- package/ai/application-ui-profile.schema.json +130 -0
- package/ai/catalog-authoring.json +25 -0
- package/ai/catalog-authoring.schema.json +61 -0
- package/ai/compile-time-contracts-v1.json +101 -0
- package/ai/compile-time-contracts-v1.schema.json +49 -0
- package/ai/component-catalog-extension-v2.d.ts +7 -0
- package/ai/component-catalog-extension-v2.schema.json +7 -0
- package/ai/component-catalog-v2-overrides.json +326 -0
- package/ai/component-catalog-v2.d.ts +67 -0
- package/ai/component-catalog-v2.json +4441 -0
- package/ai/component-catalog-v2.schema.json +246 -0
- package/ai/component-catalog.json +150 -6
- package/ai/public-api-signatures-v1.md +294 -64
- package/ai/skill.md +41 -5
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/analyzer/cli.mjs +46 -0
- package/analyzer/index.d.mts +45 -0
- package/analyzer/index.mjs +743 -0
- package/analyzer/report.schema.json +66 -0
- package/dist/browser/pane.js +3 -0
- package/dist/browser/sunken-panel.js +3 -0
- package/dist/catalog-resources.d.ts +34 -0
- package/dist/catalog-resources.js +22 -0
- package/dist/catalog-resources.js.map +1 -0
- package/dist/catalog.d.ts +21 -3
- package/dist/catalog.js +239 -210
- package/dist/catalog.js.map +1 -1
- package/dist/{chunk-ZK2G3VR5.js → chunk-5VTB2BKP.js} +1 -1
- package/dist/chunk-5VTB2BKP.js.map +1 -0
- package/dist/{chunk-S3HKPI7I.js → chunk-7KEUJIIC.js} +1 -1
- package/dist/chunk-7KEUJIIC.js.map +1 -0
- package/dist/{chunk-NVWXKU37.js → chunk-AASLYRGE.js} +1 -1
- package/dist/chunk-AASLYRGE.js.map +1 -0
- package/dist/{chunk-ENVTNLYC.js → chunk-CN2XNTAM.js} +6 -6
- package/dist/chunk-CN2XNTAM.js.map +1 -0
- package/dist/{chunk-QIRXYKCE.js → chunk-DSNIYOZ3.js} +3 -2
- package/dist/chunk-DSNIYOZ3.js.map +1 -0
- package/dist/chunk-JRKSK2HX.js +79 -0
- package/dist/chunk-JRKSK2HX.js.map +1 -0
- package/dist/{chunk-U5IFGQCD.js → chunk-K57KRAOV.js} +1 -1
- package/dist/chunk-K57KRAOV.js.map +1 -0
- package/dist/{chunk-ZVI5YST2.js → chunk-M7JBER5U.js} +1 -1
- package/dist/chunk-M7JBER5U.js.map +1 -0
- package/dist/{chunk-43FUQH35.js → chunk-OHU6CI22.js} +2 -2
- package/dist/{chunk-43FUQH35.js.map → chunk-OHU6CI22.js.map} +1 -1
- package/dist/{chunk-4TRDV6RL.js → chunk-OZWU5ZPZ.js} +1 -1
- package/dist/chunk-OZWU5ZPZ.js.map +1 -0
- package/dist/{chunk-JTHUXDN2.js → chunk-RYRIFZCT.js} +3 -3
- package/dist/chunk-RYRIFZCT.js.map +1 -0
- package/dist/{chunk-6ETZKKAE.js → chunk-VLYV65LK.js} +1 -1
- package/dist/chunk-VLYV65LK.js.map +1 -0
- package/dist/chunk-W4CXQYSG.js +23 -0
- package/dist/chunk-W4CXQYSG.js.map +1 -0
- package/dist/{chunk-S3PCZ7NV.js → chunk-W7YD6E4N.js} +1 -1
- package/dist/chunk-W7YD6E4N.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +14 -12
- package/dist/list-header.d.ts +29 -8
- package/dist/list-header.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/pane.d.ts +49 -0
- package/dist/pane.js +4 -0
- package/dist/pane.js.map +1 -0
- package/dist/panel-header.d.ts +9 -3
- package/dist/panel-header.js +1 -1
- package/dist/segmented-control.d.ts +6 -6
- package/dist/segmented-control.js +1 -1
- package/dist/select.d.ts +10 -4
- package/dist/select.js +1 -1
- package/dist/split-view.js +2 -2
- package/dist/state-banner.d.ts +3 -2
- package/dist/state-banner.js +1 -1
- package/dist/styles/catalog.css +6 -6
- package/dist/styles/layout.css +2 -20
- package/dist/styles/pane.css +62 -0
- package/dist/styles/segmented-control.css +3 -7
- package/dist/styles/sunken-panel.css +18 -0
- package/dist/sunken-panel.d.ts +16 -0
- package/dist/sunken-panel.js +3 -0
- package/dist/sunken-panel.js.map +1 -0
- package/dist/tab-bar.d.ts +3 -2
- package/dist/tab-bar.js +1 -1
- package/dist/tab-scaffold.d.ts +6 -6
- package/dist/tab-scaffold.js.map +1 -1
- package/dist/token-search-field.d.ts +25 -9
- package/dist/token-search-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +9 -5
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar-text.d.ts +10 -11
- package/dist/toolbar-text.js +1 -1
- package/dist/wire-tab-bars.d.ts +5 -2
- package/dist/wire-tab-bars.js +1 -1
- package/dist/wire-token-search-fields.d.ts +11 -6
- package/dist/wire-token-search-fields.js +1 -1
- package/docs/catalog.md +186 -67
- package/docs/component-contract.md +102 -5
- package/docs/component-selection.md +9 -5
- package/docs/design-philosophy.md +2 -4
- package/docs/examples/application-ui-profile.json +60 -0
- package/docs/examples/component-catalog-extension-v2.json +81 -0
- package/docs/layout.md +42 -23
- package/docs/sunken-panel.md +43 -0
- package/docs/type-contracts.md +99 -0
- package/docs/ui-analyzer.md +81 -0
- package/docs/ui-doctor.md +77 -0
- package/docs/ui-evaluator.md +122 -0
- package/doctor/cli.mjs +115 -0
- package/doctor/config.schema.json +68 -0
- package/doctor/index.d.mts +116 -0
- package/doctor/index.mjs +1256 -0
- package/doctor/report.schema.json +118 -0
- package/evaluator/cli.mjs +89 -0
- package/evaluator/index.d.mts +90 -0
- package/evaluator/index.mjs +1138 -0
- package/evaluator/report.schema.json +152 -0
- package/llms.txt +40 -3
- package/package.json +66 -8
- package/ux-demo/recipes/compact-toolbar.tsx +2 -2
- package/ux-demo/recipes/composer-form.tsx +1 -1
- package/dist/chunk-4TRDV6RL.js.map +0 -1
- package/dist/chunk-6ETZKKAE.js.map +0 -1
- package/dist/chunk-ENVTNLYC.js.map +0 -1
- package/dist/chunk-JTHUXDN2.js.map +0 -1
- package/dist/chunk-NVWXKU37.js.map +0 -1
- package/dist/chunk-QIRXYKCE.js.map +0 -1
- package/dist/chunk-S3HKPI7I.js.map +0 -1
- package/dist/chunk-S3PCZ7NV.js.map +0 -1
- package/dist/chunk-U5IFGQCD.js.map +0 -1
- package/dist/chunk-ZK2G3VR5.js.map +0 -1
- 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`,
|
|
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
|
|
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
|
|
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
|
+
}
|