@umkmall/proto 0.1.0-h7e3b5ebd092b → 0.1.0-ha04bbbde2f13

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 CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  The three files a UMKMall prototype loads — `umkmall-tokens.css`, `umkmall-tailwind.js` and `umkmall-ui.js` —
4
4
  published so Claude's and Gemini's artifact previews can load them from jsDelivr, the one CDN both allow.
5
+ Plus the docs a model reads (the four `.md` files and the raw starter), linked to each other at the same
6
+ version: Gemini cannot read them off the design host, which sends `X-Robots-Tag: nosnippet`.
5
7
 
6
8
  **Generated, never committed.** `scripts/proto/build-assets.mjs` builds them; `.github/workflows/proto-publish.yml`
7
9
  assembles them with this manifest and publishes them under a version that is their content hash
package/package.json CHANGED
@@ -1,12 +1,17 @@
1
1
  {
2
2
  "name": "@umkmall/proto",
3
- "version": "0.1.0-h7e3b5ebd092b",
4
- "description": "UMKMall design-system assets for single-file prototypes, served from jsDelivr. Generated — see README.",
3
+ "version": "0.1.0-ha04bbbde2f13",
4
+ "description": "UMKMall design-system assets and prototyping docs, served from jsDelivr. Generated — see README.",
5
5
  "license": "UNLICENSED",
6
6
  "files": [
7
7
  "umkmall-tokens.css",
8
8
  "umkmall-tailwind.js",
9
- "umkmall-ui.js"
9
+ "umkmall-ui.js",
10
+ "umkmall-starter.md",
11
+ "umkmall-starter-app.md",
12
+ "umkmall-components.md",
13
+ "umkmall-rules.md",
14
+ "umkmall-prototype-starter.html"
10
15
  ],
11
16
  "publishConfig": {
12
17
  "access": "public"
@@ -0,0 +1,294 @@
1
+ # UMKMall UI — components and their axes
2
+
3
+ Generated from `packages/ui/src/contract/variants.ts`. Do not hand-edit.
4
+
5
+ Every component below is published on `window.UmkmallUI` by the browser bundle. Pass only the
6
+ axis values listed, and pass every REQUIRED prop an entry names.
7
+
8
+ ```
9
+ UMKMall UI — 57 components, and the values each axis accepts.
10
+ Generated from packages/ui/src/contract/variants.ts. Do not hand-edit.
11
+
12
+ Button (Foundations)
13
+ type: primary | ghost | text
14
+ color: primary | light | danger | dark
15
+ size: large | medium | small | micro
16
+ width: auto | full
17
+ booleans: disabled, isLoading
18
+
19
+ Alert (Feedback)
20
+ type: alert | toast
21
+ function: success | info | warning | danger
22
+ size: large | medium | small
23
+ treatment: full | accent | coach | banner
24
+ appearance: default | a2ui
25
+
26
+ Badge (Content)
27
+ color: primary | warning | success | danger | light | bestseller | gradient
28
+ size: xlarge | medium | small | micro
29
+ appearance: default | a2ui
30
+ booleans: showIconLeft, showIconRight
31
+
32
+ Chip (Content)
33
+ state: default | active
34
+ size: huge | xlarge | large | medium | small | micro
35
+ appearance: default | a2ui
36
+ booleans: showIconLeft, showIconRight
37
+
38
+ TextField (Form)
39
+ size: large | small | xsmall
40
+ appearance: default | a2ui | bare
41
+ counterPlacement: below | inside
42
+ prefixPlacement: inside | outside
43
+ booleans: error, disabled
44
+
45
+ CheckBox (Form)
46
+ size: xlarge | large | medium | small
47
+ appearance: default | native
48
+ booleans: error, disabled, indeterminate
49
+
50
+ Radio (Form)
51
+ size: large | medium | small
52
+ booleans: error, disabled
53
+ REQUIRED props (not axes): label
54
+
55
+ SegmentedControl (Form)
56
+ size: medium | small
57
+ booleans: disabled
58
+ REQUIRED props (not axes): options, value, onChange
59
+
60
+ Switch (Form)
61
+ size: large | medium | small
62
+ booleans: disabled, loading
63
+ REQUIRED props (not axes): label
64
+
65
+ Slider (Form)
66
+ size: large | small
67
+ booleans: disabled
68
+
69
+ DateTimeInput (Form)
70
+ size: large | small
71
+ selection: single | range
72
+ appearance: default | a2ui
73
+ booleans: error, disabled, withTime, portal
74
+
75
+ OtpInput (Form)
76
+ size: large | small
77
+ booleans: error, disabled
78
+ REQUIRED props (not axes): value, onChange
79
+
80
+ Tabs (Navigation)
81
+ size: large | small | xsmall
82
+ state: default | active
83
+ appearance: default | a2ui
84
+ booleans: showIconLeft, showNotif, showTitle
85
+
86
+ Tooltip (Feedback)
87
+ color: dark | white
88
+ size: large | small
89
+ booleans: showClose
90
+ REQUIRED props (not axes): content
91
+
92
+ Skeleton (Feedback)
93
+ shape: text | circle | rect
94
+
95
+ Text (Foundations)
96
+ role: display | h1 | h2 | h3 | h4 | h5 | h6 | paragraph | bodyLg | bodyMd | bodySm
97
+ weight: bold | semibold | medium | regular
98
+ color: primary | secondary | disable | invert | brand | success | error | warning
99
+
100
+ Icon (Foundations)
101
+ size: xs | sm | md | lg | xl
102
+ color: primary | secondary | disable | invert | brand | success | error | warning
103
+ REQUIRED props (not axes): name
104
+
105
+ Sidebar (Shell)
106
+ state: menu | submenu
107
+ booleans: collapsed, open, active, expanded, nested
108
+ REQUIRED props (not axes): label
109
+
110
+ Header (Shell)
111
+ type: nonLogin | nonLoginBlack | login | temanAiLearn | temanAiChat | dashboard | detailPage
112
+ booleans: showBack, showTab, showTextLeft, scrolled
113
+
114
+ AppShell (Shell)
115
+ booleans: scrolled
116
+
117
+ Lightbox (Overlays)
118
+ REQUIRED props (not axes): open, onOpenChange, src
119
+
120
+ ChatComposer (Chat)
121
+ tone: neutral | info | warning | danger
122
+ REQUIRED props (not axes): value, onValueChange, editorLabel
123
+
124
+ ChatComposerInput (Chat)
125
+ REQUIRED props (not axes): value, onValueChange, label
126
+
127
+ ChatDrawer (Chat)
128
+ variant: inherit | neutral | info | warning | danger
129
+ booleans: collapsed
130
+
131
+ ChatAttachment (Chat)
132
+ variant: image | file | tile
133
+ size: default | large
134
+ booleans: showSize
135
+ REQUIRED props (not axes): name
136
+
137
+ ChatToolsButton (Chat)
138
+ state: default | active
139
+ size: compact | landing
140
+ REQUIRED props (not axes): label
141
+
142
+ ChatAttachmentButton (Chat)
143
+ state: default | active
144
+ size: compact | landing
145
+ REQUIRED props (not axes): label
146
+
147
+ ChatVoiceButton (Chat)
148
+ state: default | active
149
+ size: compact | landing
150
+ REQUIRED props (not axes): label
151
+
152
+ ChatSendButton (Chat)
153
+ state: send | stop | waiting
154
+ size: compact | landing
155
+ REQUIRED props (not axes): label
156
+
157
+ ChatSoundWave (Chat)
158
+ state: idle | listening
159
+
160
+ ChatVoiceBar (Chat)
161
+ size: compact | landing
162
+ REQUIRED props (not axes): size, label, stopLabel, onStop
163
+
164
+ ChatMessage (Chat)
165
+ sender: assistant | user | system
166
+ density: compact | balanced | spacious
167
+
168
+ ChatMessageBubble (Chat)
169
+ group: none | first | middle | last
170
+ width: auto | full
171
+ booleans: ghost
172
+
173
+ ChatMessageMetadata (Chat)
174
+ status: sending | sent | delivered | read | error
175
+
176
+ ChatMessageList (Chat)
177
+ density: compact | balanced | spacious
178
+ align: top | bottom
179
+ gap: none | 2xs | xs | sm | md | lg
180
+ booleans: streaming
181
+
182
+ ChatThread (Chat)
183
+
184
+ ChatScrollButton (Chat)
185
+ shape: icon | labelled
186
+ booleans: hasNewMessages
187
+ REQUIRED props (not axes): label
188
+
189
+ ChatMessageTTSButton (Chat)
190
+ state: idle | loading | playing | paused | error
191
+ REQUIRED props (not axes): state, label, onToggle
192
+
193
+ Dialog (Overlays)
194
+ size: small | medium | large | xlarge
195
+ side: none | left | right
196
+ booleans: centered, showCloseButton, dismissible, closeDisabled
197
+ REQUIRED props (not axes): open, onOpenChange
198
+
199
+ Menu (Overlays)
200
+ variant: pill | boxed
201
+ REQUIRED props (not axes): trigger, items
202
+
203
+ Popover (Overlays)
204
+ align: start | center | end
205
+ booleans: portal
206
+
207
+ Card (Content)
208
+ variant: elevated | outlined | plain
209
+ padding: none | small | medium | large
210
+ appearance: default | a2ui | a2ui-hero
211
+
212
+ Divider (Content)
213
+ variant: default | dashed
214
+ orientation: horizontal | vertical
215
+ appearance: default | a2ui
216
+
217
+ List (Content)
218
+
219
+ Disclosure (Content)
220
+ appearance: default | a2ui
221
+ REQUIRED props (not axes): title
222
+
223
+ Image (Content)
224
+ type: thumbnail | banner | natural | avatar
225
+ size: regular | small | blog
226
+ appearance: default | a2ui
227
+ booleans: hover
228
+
229
+ SelectionCard (Form)
230
+ size: large | small
231
+ state: default | selected | disabled
232
+ layout: row | tile
233
+ appearance: default | choice
234
+ REQUIRED props (not axes): options
235
+
236
+ Upload (Form)
237
+ size: large | small
238
+ status: default | filled | error | disabled | busy
239
+ border: solid | dashed
240
+ appearance: default | a2ui
241
+
242
+ Select (Form)
243
+ size: large | small
244
+ status: default | filled | error | disabled
245
+ booleans: multiple, portal
246
+ REQUIRED props (not axes): options
247
+
248
+ CodeBlock (Content)
249
+ size: large | small
250
+ appearance: default | a2ui
251
+
252
+ Stepper (Navigation)
253
+ position: first | middle | last
254
+ state: default | current | done
255
+ orientation: horizontal | vertical
256
+ REQUIRED props (not axes): steps
257
+
258
+ Pagination (Navigation)
259
+ size: large | small
260
+ density: compact | comfortable
261
+ booleans: disabled
262
+ REQUIRED props (not axes): page, onPageChange
263
+
264
+ Table (Content)
265
+ density: compact | comfortable
266
+ booleans: loading, serverSide, hidePagination, fixedLayout, noBorder, slimScrollbar
267
+
268
+ Spinner (Feedback)
269
+ variant: primary | white | gray | gradient
270
+ size: sm | md | lg | xl
271
+
272
+ ProgressBar (Feedback)
273
+ variant: default | success | warning | error | gray | gradient
274
+ size: large | medium | small
275
+ shape: linear | radial
276
+
277
+ Toaster (Feedback)
278
+ position: top-left | top-center | top-right | bottom-left | bottom-center | bottom-right
279
+
280
+ Label (Form)
281
+ variant: default | error | success
282
+ size: sm | md | lg
283
+ look: default | field-large | field-small
284
+ booleans: required
285
+
286
+ TRAPS — each of these renders or ignores silently, with no error:
287
+
288
+ 1. `Text` roles are camelCase: `bodyLg`, `paragraphSm`, `labelMd`. A kebab-case or Title-Case role matches no variant and the text renders with no type styling at all.
289
+ 2. `Header`’s `title` is rendered ONLY when `showTextLeft` is also passed. `title` alone is silently dropped — the header renders, without its title.
290
+ 3. `Alert` has no `title` prop. Put the heading in `children`; a `title` passed to it lands on the underlying `div` as a DOM attribute and shows up as a tooltip.
291
+ 4. THE AXES ARE NOT THE PROP LIST. An axis is a STYLING choice; a component can also require DATA, and any entry above with a “REQUIRED props” line will not render without it. `Stepper` is the one that catches everyone: its axes are `position`, `state` and `orientation`, and all three belong to a STEP — the component itself takes `steps={[{ label, state, position }]}`. Writing `<Stepper position="first" state="done" />` throws inside the component, React unmounts the whole tree, and the page goes BLANK. Same shape for `SelectionCard` (`options`), `Select` (`options`), `Menu` (`trigger`, `items`) and `Dialog` (`open`, `onOpenChange`).
292
+ 5. AN AXIS NAME IS NOT ALWAYS THE PROP NAME. Every axis listed above is passed under its own name EXCEPT two: write `variant` (not `function`) for `Alert`, and `variant` (not `role`) for `Text` — taking the legal values from the `function` and `role` axes respectively. Those two keep Figma’s word in the contract because `function` is a reserved word and `role` is an ARIA attribute. Passing the axis name instead of the prop renders the component with no styling and no error.
293
+ 6. The `Table` entry exports the plain parts AND `DataTable`, and the REQUIRED props line above reads only the parts. `DataTable` needs `columns` (tanstack `ColumnDef`s, e.g. `[{ accessorKey: "name", header: "Nama" }]`) and `data`; without them it throws and the page goes blank. `Pagination` needs `page` (1-based) and `onPageChange`; pass `pageCount` for a numbered strip, or omit it and pass `hasNext` for a cursor source, or next stays disabled.
294
+ ```