@once-ui-system/core 2.0.0-alpha.1 → 2.0.0-alpha.2

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 (116) hide show
  1. package/ai/catalog.json +11 -4
  2. package/ai/components/Effect.json +1 -1
  3. package/ai/components/Feedback.json +1 -0
  4. package/ai/components/Form.json +15 -0
  5. package/ai/components/Input.json +3 -2
  6. package/ai/components/{Particle.json → ParticleFx.json} +1 -1
  7. package/ai/components/ScrollContainer.json +9 -1
  8. package/ai/components/Textarea.json +3 -2
  9. package/ai/components/ThemeSwitcher.json +2 -1
  10. package/ai/examples/blocks/Footer4.tsx +2 -2
  11. package/ai/examples/blocks/manifest.json +2 -2
  12. package/ai/gotchas.json +7 -0
  13. package/ai/manifest.json +2 -2
  14. package/ai/rules.md +1 -1
  15. package/ai/spec.json +35 -10
  16. package/dist/ai/catalog.json +11 -4
  17. package/dist/ai/components/Effect.json +1 -1
  18. package/dist/ai/components/Feedback.json +1 -0
  19. package/dist/ai/components/Form.json +15 -0
  20. package/dist/ai/components/Input.json +3 -2
  21. package/dist/ai/components/{Particle.json → ParticleFx.json} +1 -1
  22. package/dist/ai/components/ScrollContainer.json +9 -1
  23. package/dist/ai/components/Textarea.json +3 -2
  24. package/dist/ai/components/ThemeSwitcher.json +2 -1
  25. package/dist/ai/examples/blocks/manifest.json +2 -2
  26. package/dist/ai/gotchas.json +7 -0
  27. package/dist/ai/manifest.json +2 -2
  28. package/dist/ai/rules.md +1 -1
  29. package/dist/ai/spec.json +35 -10
  30. package/dist/components/Animation.d.ts +1 -2
  31. package/dist/components/Animation.d.ts.map +1 -1
  32. package/dist/components/Animation.js +1 -1
  33. package/dist/components/Animation.js.map +1 -1
  34. package/dist/components/ArrowNavigationContext.d.ts.map +1 -1
  35. package/dist/components/ArrowNavigationContext.js +12 -3
  36. package/dist/components/ArrowNavigationContext.js.map +1 -1
  37. package/dist/components/ContextMenu.d.ts +1 -1
  38. package/dist/components/ContextMenu.d.ts.map +1 -1
  39. package/dist/components/CursorCard.d.ts +1 -1
  40. package/dist/components/CursorCard.d.ts.map +1 -1
  41. package/dist/components/DatePicker.d.ts.map +1 -1
  42. package/dist/components/DatePicker.js +7 -0
  43. package/dist/components/DatePicker.js.map +1 -1
  44. package/dist/components/DropdownWrapper.d.ts +1 -1
  45. package/dist/components/DropdownWrapper.d.ts.map +1 -1
  46. package/dist/components/DropdownWrapper.js +178 -35
  47. package/dist/components/DropdownWrapper.js.map +1 -1
  48. package/dist/components/DropdownWrapper.module.scss +3 -1
  49. package/dist/components/Effect.d.ts +2 -2
  50. package/dist/components/Effect.d.ts.map +1 -1
  51. package/dist/components/Effect.js +2 -2
  52. package/dist/components/Effect.js.map +1 -1
  53. package/dist/components/Feedback.d.ts +4 -0
  54. package/dist/components/Feedback.d.ts.map +1 -1
  55. package/dist/components/Feedback.js +2 -2
  56. package/dist/components/Feedback.js.map +1 -1
  57. package/dist/components/FocusTrap.d.ts +3 -3
  58. package/dist/components/FocusTrap.d.ts.map +1 -1
  59. package/dist/components/FocusTrap.js +10 -0
  60. package/dist/components/FocusTrap.js.map +1 -1
  61. package/dist/components/Form.d.ts +48 -0
  62. package/dist/components/Form.d.ts.map +1 -0
  63. package/dist/components/Form.js +191 -0
  64. package/dist/components/Form.js.map +1 -0
  65. package/dist/components/Form.module.scss +160 -0
  66. package/dist/components/FormContext.d.ts +20 -0
  67. package/dist/components/FormContext.d.ts.map +1 -0
  68. package/dist/components/FormContext.js +12 -0
  69. package/dist/components/FormContext.js.map +1 -0
  70. package/dist/components/Input.d.ts +3 -0
  71. package/dist/components/Input.d.ts.map +1 -1
  72. package/dist/components/Input.js +13 -2
  73. package/dist/components/Input.js.map +1 -1
  74. package/dist/components/Input.module.scss +27 -6
  75. package/dist/components/{Particle.d.ts → ParticleFx.d.ts} +9 -4
  76. package/dist/components/ParticleFx.d.ts.map +1 -0
  77. package/dist/components/{Particle.js → ParticleFx.js} +9 -4
  78. package/dist/components/ParticleFx.js.map +1 -0
  79. package/dist/components/ScrollContainer.d.ts +69 -2
  80. package/dist/components/ScrollContainer.d.ts.map +1 -1
  81. package/dist/components/ScrollContainer.js +377 -46
  82. package/dist/components/ScrollContainer.js.map +1 -1
  83. package/dist/components/ScrollContainer.module.scss +131 -0
  84. package/dist/components/Select.d.ts +1 -1
  85. package/dist/components/Select.d.ts.map +1 -1
  86. package/dist/components/Setting.d.ts.map +1 -1
  87. package/dist/components/Setting.js +6 -1
  88. package/dist/components/Setting.js.map +1 -1
  89. package/dist/components/Textarea.d.ts +3 -0
  90. package/dist/components/Textarea.d.ts.map +1 -1
  91. package/dist/components/Textarea.js +22 -6
  92. package/dist/components/Textarea.js.map +1 -1
  93. package/dist/components/ThemeSwitcher.d.ts +16 -0
  94. package/dist/components/ThemeSwitcher.d.ts.map +1 -1
  95. package/dist/components/ThemeSwitcher.js +48 -9
  96. package/dist/components/ThemeSwitcher.js.map +1 -1
  97. package/dist/components/ThemeSwitcher.module.scss +112 -0
  98. package/dist/components/UserMenu.d.ts +1 -1
  99. package/dist/components/UserMenu.d.ts.map +1 -1
  100. package/dist/components/index.d.ts +2 -1
  101. package/dist/components/index.d.ts.map +1 -1
  102. package/dist/components/index.js +2 -1
  103. package/dist/components/index.js.map +1 -1
  104. package/dist/data/emoji-data.json +10 -0
  105. package/dist/hooks/useArrowNavigation.d.ts.map +1 -1
  106. package/dist/hooks/useArrowNavigation.js +52 -7
  107. package/dist/hooks/useArrowNavigation.js.map +1 -1
  108. package/dist/modules/navigation/MegaMenu.d.ts.map +1 -1
  109. package/dist/modules/navigation/MegaMenu.js +76 -10
  110. package/dist/modules/navigation/MegaMenu.js.map +1 -1
  111. package/dist/package.json +1 -1
  112. package/dist/types.d.ts +14 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/package.json +1 -1
  115. package/dist/components/Particle.d.ts.map +0 -1
  116. package/dist/components/Particle.js.map +0 -1
package/ai/catalog.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "2.0.0-alpha.1",
3
- "generated": "2026-09-17",
2
+ "version": "2.0.0-alpha.2",
3
+ "generated": "2026-09-23",
4
4
  "components": {
5
5
  "Accordion": {
6
6
  "group": "components",
@@ -430,6 +430,13 @@
430
430
  "components"
431
431
  ]
432
432
  },
433
+ "Form": {
434
+ "group": "components",
435
+ "purpose": "Form component",
436
+ "tags": [
437
+ "components"
438
+ ]
439
+ },
433
440
  "GlitchFx": {
434
441
  "group": "components",
435
442
  "extends": [
@@ -683,12 +690,12 @@
683
690
  "components"
684
691
  ]
685
692
  },
686
- "Particle": {
693
+ "ParticleFx": {
687
694
  "group": "components",
688
695
  "extends": [
689
696
  "Flex"
690
697
  ],
691
- "purpose": "Particle component",
698
+ "purpose": "ParticleFx component",
692
699
  "tags": [
693
700
  "components"
694
701
  ]
@@ -20,7 +20,7 @@
20
20
  "blob": "Omit<React.ComponentProps<typeof BlobFx>, \"children\">",
21
21
  "matrix": "Omit<React.ComponentProps<typeof MatrixFx>, \"children\">",
22
22
  "weather": "Omit<React.ComponentProps<typeof WeatherFx>, \"children\">",
23
- "particle": "Omit<React.ComponentProps<typeof Particle>, \"children\">",
23
+ "particle": "Omit<React.ComponentProps<typeof ParticleFx>, \"children\">",
24
24
  "celebration": "Omit<React.ComponentProps<typeof CelebrationFx>, \"children\">",
25
25
  "children": "React.ReactNode"
26
26
  },
@@ -15,6 +15,7 @@
15
15
  "props": {
16
16
  "variant": "\"info\" | \"danger\" | \"warning\" | \"success\" = info",
17
17
  "showIcon": "boolean = true",
18
+ "icon": "IconName",
18
19
  "title": "string",
19
20
  "description": "string",
20
21
  "showCloseButton": "boolean = false",
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "Form",
3
+ "group": "components",
4
+ "props": {
5
+ "density": "\"stacked\" | \"tight\" | \"spacious\" = tight",
6
+ "columns": "FormColumns",
7
+ "size": "TShirtSizes",
8
+ "as": "\"div\" | \"form\" = div",
9
+ "onSubmit": "React.FormEventHandler<HTMLFormElement>",
10
+ "className": "string",
11
+ "style": "React.CSSProperties",
12
+ "children": "React.ReactNode"
13
+ },
14
+ "mixinsRef": []
15
+ }
@@ -5,7 +5,7 @@
5
5
  "id": "!string",
6
6
  "label": "string",
7
7
  "placeholder": "string",
8
- "size": "TShirtSizes = m",
8
+ "size": "TShirtSizes",
9
9
  "error": "boolean = false",
10
10
  "errorMessage": "ReactNode",
11
11
  "description": "ReactNode",
@@ -19,7 +19,8 @@
19
19
  "characterCount": "boolean",
20
20
  "cursor": "undefined | \"interactive\"",
21
21
  "validate": "(value: ReactNode) => ReactNode | null",
22
- "loading": "boolean = false"
22
+ "loading": "boolean = false",
23
+ "span": "number"
23
24
  },
24
25
  "mixinsRef": []
25
26
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "Particle",
2
+ "name": "ParticleFx",
3
3
  "group": "components",
4
4
  "extends": [
5
5
  "Flex"
@@ -15,7 +15,15 @@
15
15
  ],
16
16
  "props": {
17
17
  "items": "!React.ReactNode[]",
18
- "controlPlacement": "\"top-start\" | \"top-center\" | \"top-end\" | \"top-between\" | \"bottom-start\" | \"bottom-center\" | \"bottom-end\" | \"bottom-between\" = top-start"
18
+ "controlPlacement": "ScrollContainerControlPlacement = top-start",
19
+ "infinite": "boolean = false",
20
+ "markers": "boolean | \"top\" | \"bottom\" = false",
21
+ "draggable": "boolean = true",
22
+ "step": "number = 1",
23
+ "clip": "boolean = false",
24
+ "proximity": "boolean | number = false",
25
+ "active": "number",
26
+ "onActiveChange": "(index: number) => void"
19
27
  },
20
28
  "mixinsRef": [
21
29
  "CommonProps",
@@ -6,7 +6,7 @@
6
6
  "label": "string",
7
7
  "placeholder": "string",
8
8
  "lines": "number | \"auto\" = auto",
9
- "size": "TShirtSizes = m",
9
+ "size": "TShirtSizes",
10
10
  "error": "boolean = false",
11
11
  "errorMessage": "ReactNode",
12
12
  "description": "ReactNode",
@@ -19,7 +19,8 @@
19
19
  "characterCount": "boolean",
20
20
  "resize": "\"horizontal\" | \"vertical\" | \"both\" | \"none\" = vertical",
21
21
  "validate": "(value: ReactNode) => ReactNode | null",
22
- "disabled": "boolean = false"
22
+ "disabled": "boolean = false",
23
+ "span": "number"
23
24
  },
24
25
  "mixinsRef": []
25
26
  }
@@ -14,7 +14,8 @@
14
14
  "StyleProps"
15
15
  ],
16
16
  "props": {
17
- "collapsed": "boolean"
17
+ "collapsed": "boolean",
18
+ "direction": "\"row\" | \"column\" = row"
18
19
  },
19
20
  "mixinsRef": [
20
21
  "CommonProps",
@@ -1,4 +1,4 @@
1
- import { Avatar, Background, Button, Column, IconButton, Logo, Mask, Particle, Row, SmartLink, Tag, Text, TypeFx } from "@once-ui-system/core";
1
+ import { Avatar, Background, Button, Column, IconButton, Logo, Mask, ParticleFx, Row, SmartLink, Tag, Text, TypeFx } from "@once-ui-system/core";
2
2
  import type { IconName } from "@once-ui-system/core";
3
3
 
4
4
  const social: { icon: IconName; label: string; href: string }[] = [
@@ -147,7 +147,7 @@ export const Footer4 = (flex: React.ComponentProps<typeof Column>) => {
147
147
  y={50}
148
148
  radius={25}
149
149
  >
150
- <Particle style={{transform: "scale(1.1)"}} opacity={70} position="absolute" top="0" left="0" fill interactive speed={1.5} density={100} size="2" intensity={20} mode="attract"/>
150
+ <ParticleFx style={{transform: "scale(1.1)"}} opacity={70} position="absolute" top="0" left="0" fill interactive speed={1.5} density={100} size="2" intensity={20} mode="attract"/>
151
151
  </Mask>
152
152
  </Row>
153
153
  <Column horizontal="center" gap="20">
@@ -69,9 +69,9 @@
69
69
  {
70
70
  "id": "Footer4",
71
71
  "file": "Footer4.tsx",
72
- "title": "Premium footer with TypeFx + Particle",
72
+ "title": "Premium footer with TypeFx + ParticleFx",
73
73
  "tags": ["footer", "marketing", "effect"],
74
- "components": ["Background", "Particle", "TypeFx", "Mask", "Avatar", "Tag"],
74
+ "components": ["Background", "ParticleFx", "TypeFx", "Mask", "Avatar", "Tag"],
75
75
  "patterns": ["animated wordmark", "particle decoration", "masked gradient"],
76
76
  "tasks": ["marketing-hero"],
77
77
  "standalone": true
package/ai/gotchas.json CHANGED
@@ -76,6 +76,13 @@
76
76
  "Tag"
77
77
  ]
78
78
  },
79
+ "Timeline.notScrubber": {
80
+ "rule": "Timeline lays a sequence of steps down the page. For a video or audio editor's timeline — a playhead over stacked tracks of movable, trimmable blocks — use Scrubber. Do not build one out of Flex and absolute positioning.",
81
+ "components": [
82
+ "Timeline",
83
+ "Scrubber"
84
+ ]
85
+ },
79
86
  "color.tokens": {
80
87
  "rule": "Colors are semantic tokens ({scheme}-{weight}), never hex/rgb. background also accepts surface | overlay | page | transparent.",
81
88
  "components": [
package/ai/manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "2.0.0-alpha.1",
3
- "generated": "2026-09-17",
2
+ "version": "2.0.0-alpha.2",
3
+ "generated": "2026-09-23",
4
4
  "files": {
5
5
  "spec": "spec.json",
6
6
  "catalog": "catalog.json",
package/ai/rules.md CHANGED
@@ -117,7 +117,7 @@ If you can't ask (or the user says "you decide"), default to: restrained, center
117
117
 
118
118
  13. Use the distinctive features when the design calls for them — they exist and are cheap:
119
119
  - `Dialog` supports `stack` (stacked dialogs) and `base` props
120
- - Effects: `RevealFx`, `LetterFx`, `TypeFx`, `CountFx`, `GlitchFx`, `HoloFx`, `TiltFx`, `FlipFx`, `MatrixFx`, `BlobFx`, `Particle`, `ShineFx`, `CelebrationFx`
120
+ - Effects: `RevealFx`, `LetterFx`, `TypeFx`, `CountFx`, `GlitchFx`, `HoloFx`, `TiltFx`, `FlipFx`, `MatrixFx`, `BlobFx`, `ParticleFx`, `ShineFx`, `CelebrationFx`
121
121
  - `CursorCard`, `HoverCard`, `ContextMenu`, `EmojiPicker`, `CompareImage`, `OgCard`, `Timeline`, `MasonryGrid`, `InfiniteScroll`, `SegmentedControl`, `Kbar` (command palette)
122
122
  - Forms: `Input`, `PasswordInput`, `OTPInput`, `NumberInput`, `TagInput`, `Select`, `DatePicker`, `DateRangePicker`, `ColorInput`, `Slider`, `Switch`, `Checkbox`, `Chip`
123
123
 
package/ai/spec.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@once-ui-system/core",
3
- "version": "2.0.0-alpha.1",
4
- "generated": "2026-09-17",
3
+ "version": "2.0.0-alpha.2",
4
+ "generated": "2026-09-23",
5
5
  "format": "props are 'type', 'type = default', or '!type' (required). Components with 'mixins' also accept all props of those mixins. 'extends' means all props of that component are accepted. In 'types', an array lists a union's allowed values, an object gives a shape's fields in the same notation as props, and a string is the type as written — usually pointing at a component whose props are already listed.",
6
6
  "tokens": {
7
7
  "StaticSpacingToken": "\"0\" | \"1\" | \"2\" | \"4\" | \"8\" | \"12\" | \"16\" | \"20\" | \"24\" | \"32\" | \"40\" | \"48\" | \"56\" | \"64\" | \"72\" | \"80\" | \"104\" | \"128\" | \"160\"",
@@ -1180,6 +1180,7 @@
1180
1180
  "props": {
1181
1181
  "variant": "\"info\" | \"danger\" | \"warning\" | \"success\" = info",
1182
1182
  "showIcon": "boolean = true",
1183
+ "icon": "IconName",
1183
1184
  "title": "string",
1184
1185
  "description": "string",
1185
1186
  "showCloseButton": "boolean = false",
@@ -1233,6 +1234,19 @@
1233
1234
  "style": "React.CSSProperties"
1234
1235
  }
1235
1236
  },
1237
+ "Form": {
1238
+ "group": "components",
1239
+ "props": {
1240
+ "density": "\"stacked\" | \"tight\" | \"spacious\" = tight",
1241
+ "columns": "FormColumns",
1242
+ "size": "TShirtSizes",
1243
+ "as": "\"div\" | \"form\" = div",
1244
+ "onSubmit": "React.FormEventHandler<HTMLFormElement>",
1245
+ "className": "string",
1246
+ "style": "React.CSSProperties",
1247
+ "children": "React.ReactNode"
1248
+ }
1249
+ },
1236
1250
  "GlitchFx": {
1237
1251
  "group": "components",
1238
1252
  "extends": [
@@ -1436,7 +1450,7 @@
1436
1450
  "id": "!string",
1437
1451
  "label": "string",
1438
1452
  "placeholder": "string",
1439
- "size": "TShirtSizes = m",
1453
+ "size": "TShirtSizes",
1440
1454
  "error": "boolean = false",
1441
1455
  "errorMessage": "ReactNode",
1442
1456
  "description": "ReactNode",
@@ -1450,7 +1464,8 @@
1450
1464
  "characterCount": "boolean",
1451
1465
  "cursor": "undefined | \"interactive\"",
1452
1466
  "validate": "(value: ReactNode) => ReactNode | null",
1453
- "loading": "boolean = false"
1467
+ "loading": "boolean = false",
1468
+ "span": "number"
1454
1469
  }
1455
1470
  },
1456
1471
  "InteractiveDetails": {
@@ -1782,7 +1797,7 @@
1782
1797
  "autoFocus": "boolean = false"
1783
1798
  }
1784
1799
  },
1785
- "Particle": {
1800
+ "ParticleFx": {
1786
1801
  "group": "components",
1787
1802
  "extends": [
1788
1803
  "Flex"
@@ -1960,7 +1975,15 @@
1960
1975
  ],
1961
1976
  "props": {
1962
1977
  "items": "!React.ReactNode[]",
1963
- "controlPlacement": "\"top-start\" | \"top-center\" | \"top-end\" | \"top-between\" | \"bottom-start\" | \"bottom-center\" | \"bottom-end\" | \"bottom-between\" = top-start"
1978
+ "controlPlacement": "ScrollContainerControlPlacement = top-start",
1979
+ "infinite": "boolean = false",
1980
+ "markers": "boolean | \"top\" | \"bottom\" = false",
1981
+ "draggable": "boolean = true",
1982
+ "step": "number = 1",
1983
+ "clip": "boolean = false",
1984
+ "proximity": "boolean | number = false",
1985
+ "active": "number",
1986
+ "onActiveChange": "(index: number) => void"
1964
1987
  }
1965
1988
  },
1966
1989
  "ScrollToTop": {
@@ -2295,7 +2318,7 @@
2295
2318
  "label": "string",
2296
2319
  "placeholder": "string",
2297
2320
  "lines": "number | \"auto\" = auto",
2298
- "size": "TShirtSizes = m",
2321
+ "size": "TShirtSizes",
2299
2322
  "error": "boolean = false",
2300
2323
  "errorMessage": "ReactNode",
2301
2324
  "description": "ReactNode",
@@ -2308,7 +2331,8 @@
2308
2331
  "characterCount": "boolean",
2309
2332
  "resize": "\"horizontal\" | \"vertical\" | \"both\" | \"none\" = vertical",
2310
2333
  "validate": "(value: ReactNode) => ReactNode | null",
2311
- "disabled": "boolean = false"
2334
+ "disabled": "boolean = false",
2335
+ "span": "number"
2312
2336
  }
2313
2337
  },
2314
2338
  "TiltFx": {
@@ -2445,7 +2469,8 @@
2445
2469
  "StyleProps"
2446
2470
  ],
2447
2471
  "props": {
2448
- "collapsed": "boolean"
2472
+ "collapsed": "boolean",
2473
+ "direction": "\"row\" | \"column\" = row"
2449
2474
  }
2450
2475
  },
2451
2476
  "User": {
@@ -2521,7 +2546,7 @@
2521
2546
  "blob": "Omit<React.ComponentProps<typeof BlobFx>, \"children\">",
2522
2547
  "matrix": "Omit<React.ComponentProps<typeof MatrixFx>, \"children\">",
2523
2548
  "weather": "Omit<React.ComponentProps<typeof WeatherFx>, \"children\">",
2524
- "particle": "Omit<React.ComponentProps<typeof Particle>, \"children\">",
2549
+ "particle": "Omit<React.ComponentProps<typeof ParticleFx>, \"children\">",
2525
2550
  "celebration": "Omit<React.ComponentProps<typeof CelebrationFx>, \"children\">",
2526
2551
  "children": "React.ReactNode"
2527
2552
  }
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "2.0.0-alpha.1",
3
- "generated": "2026-09-17",
2
+ "version": "2.0.0-alpha.2",
3
+ "generated": "2026-09-23",
4
4
  "components": {
5
5
  "Accordion": {
6
6
  "group": "components",
@@ -430,6 +430,13 @@
430
430
  "components"
431
431
  ]
432
432
  },
433
+ "Form": {
434
+ "group": "components",
435
+ "purpose": "Form component",
436
+ "tags": [
437
+ "components"
438
+ ]
439
+ },
433
440
  "GlitchFx": {
434
441
  "group": "components",
435
442
  "extends": [
@@ -683,12 +690,12 @@
683
690
  "components"
684
691
  ]
685
692
  },
686
- "Particle": {
693
+ "ParticleFx": {
687
694
  "group": "components",
688
695
  "extends": [
689
696
  "Flex"
690
697
  ],
691
- "purpose": "Particle component",
698
+ "purpose": "ParticleFx component",
692
699
  "tags": [
693
700
  "components"
694
701
  ]
@@ -20,7 +20,7 @@
20
20
  "blob": "Omit<React.ComponentProps<typeof BlobFx>, \"children\">",
21
21
  "matrix": "Omit<React.ComponentProps<typeof MatrixFx>, \"children\">",
22
22
  "weather": "Omit<React.ComponentProps<typeof WeatherFx>, \"children\">",
23
- "particle": "Omit<React.ComponentProps<typeof Particle>, \"children\">",
23
+ "particle": "Omit<React.ComponentProps<typeof ParticleFx>, \"children\">",
24
24
  "celebration": "Omit<React.ComponentProps<typeof CelebrationFx>, \"children\">",
25
25
  "children": "React.ReactNode"
26
26
  },
@@ -15,6 +15,7 @@
15
15
  "props": {
16
16
  "variant": "\"info\" | \"danger\" | \"warning\" | \"success\" = info",
17
17
  "showIcon": "boolean = true",
18
+ "icon": "IconName",
18
19
  "title": "string",
19
20
  "description": "string",
20
21
  "showCloseButton": "boolean = false",
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "Form",
3
+ "group": "components",
4
+ "props": {
5
+ "density": "\"stacked\" | \"tight\" | \"spacious\" = tight",
6
+ "columns": "FormColumns",
7
+ "size": "TShirtSizes",
8
+ "as": "\"div\" | \"form\" = div",
9
+ "onSubmit": "React.FormEventHandler<HTMLFormElement>",
10
+ "className": "string",
11
+ "style": "React.CSSProperties",
12
+ "children": "React.ReactNode"
13
+ },
14
+ "mixinsRef": []
15
+ }
@@ -5,7 +5,7 @@
5
5
  "id": "!string",
6
6
  "label": "string",
7
7
  "placeholder": "string",
8
- "size": "TShirtSizes = m",
8
+ "size": "TShirtSizes",
9
9
  "error": "boolean = false",
10
10
  "errorMessage": "ReactNode",
11
11
  "description": "ReactNode",
@@ -19,7 +19,8 @@
19
19
  "characterCount": "boolean",
20
20
  "cursor": "undefined | \"interactive\"",
21
21
  "validate": "(value: ReactNode) => ReactNode | null",
22
- "loading": "boolean = false"
22
+ "loading": "boolean = false",
23
+ "span": "number"
23
24
  },
24
25
  "mixinsRef": []
25
26
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "Particle",
2
+ "name": "ParticleFx",
3
3
  "group": "components",
4
4
  "extends": [
5
5
  "Flex"
@@ -15,7 +15,15 @@
15
15
  ],
16
16
  "props": {
17
17
  "items": "!React.ReactNode[]",
18
- "controlPlacement": "\"top-start\" | \"top-center\" | \"top-end\" | \"top-between\" | \"bottom-start\" | \"bottom-center\" | \"bottom-end\" | \"bottom-between\" = top-start"
18
+ "controlPlacement": "ScrollContainerControlPlacement = top-start",
19
+ "infinite": "boolean = false",
20
+ "markers": "boolean | \"top\" | \"bottom\" = false",
21
+ "draggable": "boolean = true",
22
+ "step": "number = 1",
23
+ "clip": "boolean = false",
24
+ "proximity": "boolean | number = false",
25
+ "active": "number",
26
+ "onActiveChange": "(index: number) => void"
19
27
  },
20
28
  "mixinsRef": [
21
29
  "CommonProps",
@@ -6,7 +6,7 @@
6
6
  "label": "string",
7
7
  "placeholder": "string",
8
8
  "lines": "number | \"auto\" = auto",
9
- "size": "TShirtSizes = m",
9
+ "size": "TShirtSizes",
10
10
  "error": "boolean = false",
11
11
  "errorMessage": "ReactNode",
12
12
  "description": "ReactNode",
@@ -19,7 +19,8 @@
19
19
  "characterCount": "boolean",
20
20
  "resize": "\"horizontal\" | \"vertical\" | \"both\" | \"none\" = vertical",
21
21
  "validate": "(value: ReactNode) => ReactNode | null",
22
- "disabled": "boolean = false"
22
+ "disabled": "boolean = false",
23
+ "span": "number"
23
24
  },
24
25
  "mixinsRef": []
25
26
  }
@@ -14,7 +14,8 @@
14
14
  "StyleProps"
15
15
  ],
16
16
  "props": {
17
- "collapsed": "boolean"
17
+ "collapsed": "boolean",
18
+ "direction": "\"row\" | \"column\" = row"
18
19
  },
19
20
  "mixinsRef": [
20
21
  "CommonProps",
@@ -69,9 +69,9 @@
69
69
  {
70
70
  "id": "Footer4",
71
71
  "file": "Footer4.tsx",
72
- "title": "Premium footer with TypeFx + Particle",
72
+ "title": "Premium footer with TypeFx + ParticleFx",
73
73
  "tags": ["footer", "marketing", "effect"],
74
- "components": ["Background", "Particle", "TypeFx", "Mask", "Avatar", "Tag"],
74
+ "components": ["Background", "ParticleFx", "TypeFx", "Mask", "Avatar", "Tag"],
75
75
  "patterns": ["animated wordmark", "particle decoration", "masked gradient"],
76
76
  "tasks": ["marketing-hero"],
77
77
  "standalone": true
@@ -76,6 +76,13 @@
76
76
  "Tag"
77
77
  ]
78
78
  },
79
+ "Timeline.notScrubber": {
80
+ "rule": "Timeline lays a sequence of steps down the page. For a video or audio editor's timeline — a playhead over stacked tracks of movable, trimmable blocks — use Scrubber. Do not build one out of Flex and absolute positioning.",
81
+ "components": [
82
+ "Timeline",
83
+ "Scrubber"
84
+ ]
85
+ },
79
86
  "color.tokens": {
80
87
  "rule": "Colors are semantic tokens ({scheme}-{weight}), never hex/rgb. background also accepts surface | overlay | page | transparent.",
81
88
  "components": [
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "2.0.0-alpha.1",
3
- "generated": "2026-09-17",
2
+ "version": "2.0.0-alpha.2",
3
+ "generated": "2026-09-23",
4
4
  "files": {
5
5
  "spec": "spec.json",
6
6
  "catalog": "catalog.json",
package/dist/ai/rules.md CHANGED
@@ -117,7 +117,7 @@ If you can't ask (or the user says "you decide"), default to: restrained, center
117
117
 
118
118
  13. Use the distinctive features when the design calls for them — they exist and are cheap:
119
119
  - `Dialog` supports `stack` (stacked dialogs) and `base` props
120
- - Effects: `RevealFx`, `LetterFx`, `TypeFx`, `CountFx`, `GlitchFx`, `HoloFx`, `TiltFx`, `FlipFx`, `MatrixFx`, `BlobFx`, `Particle`, `ShineFx`, `CelebrationFx`
120
+ - Effects: `RevealFx`, `LetterFx`, `TypeFx`, `CountFx`, `GlitchFx`, `HoloFx`, `TiltFx`, `FlipFx`, `MatrixFx`, `BlobFx`, `ParticleFx`, `ShineFx`, `CelebrationFx`
121
121
  - `CursorCard`, `HoverCard`, `ContextMenu`, `EmojiPicker`, `CompareImage`, `OgCard`, `Timeline`, `MasonryGrid`, `InfiniteScroll`, `SegmentedControl`, `Kbar` (command palette)
122
122
  - Forms: `Input`, `PasswordInput`, `OTPInput`, `NumberInput`, `TagInput`, `Select`, `DatePicker`, `DateRangePicker`, `ColorInput`, `Slider`, `Switch`, `Checkbox`, `Chip`
123
123