@mlola-ui/registry 1.0.13 → 1.1.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 (150) hide show
  1. package/components/accordion.json +4 -4
  2. package/components/activity-heatmap.json +2 -2
  3. package/components/alert.json +9 -3
  4. package/components/app-shell.json +9 -3
  5. package/components/avatar.json +2 -2
  6. package/components/badge.json +2 -2
  7. package/components/breadcrumb.json +2 -2
  8. package/components/button.json +12 -3
  9. package/components/calendar.json +2 -2
  10. package/components/card.json +2 -2
  11. package/components/carousel.json +10 -4
  12. package/components/checkbox.json +2 -2
  13. package/components/color-picker.json +3 -3
  14. package/components/combobox.json +3 -3
  15. package/components/command-menu.json +3 -3
  16. package/components/context-menu.json +5 -5
  17. package/components/copy-button.json +10 -2
  18. package/components/date-picker.json +3 -3
  19. package/components/dropdown-menu.json +3 -3
  20. package/components/dropzone.json +1 -1
  21. package/components/empty-state.json +2 -2
  22. package/components/hover-card.json +4 -4
  23. package/components/input.json +2 -2
  24. package/components/kbd.json +1 -1
  25. package/components/modal.json +17 -5
  26. package/components/number-input.json +3 -3
  27. package/components/otp-input.json +2 -2
  28. package/components/pagination.json +2 -2
  29. package/components/password-input.json +2 -2
  30. package/components/popover.json +4 -4
  31. package/components/priority-icon.json +1 -1
  32. package/components/progress.json +8 -2
  33. package/components/radio-group.json +1 -1
  34. package/components/rating.json +1 -1
  35. package/components/resizable.json +1 -1
  36. package/components/segmented-control.json +2 -2
  37. package/components/select.json +8 -6
  38. package/components/sheet.json +17 -5
  39. package/components/skeleton.json +1 -1
  40. package/components/slider.json +6 -4
  41. package/components/spinner.json +1 -1
  42. package/components/status-icon.json +1 -1
  43. package/components/stepper.json +2 -2
  44. package/components/table.json +1 -1
  45. package/components/tabs.json +3 -3
  46. package/components/tag-input.json +3 -3
  47. package/components/textarea.json +8 -2
  48. package/components/time-picker.json +3 -3
  49. package/components/timeline.json +2 -2
  50. package/components/toast.json +2 -2
  51. package/components/toggle.json +1 -1
  52. package/components/tooltip.json +3 -3
  53. package/components/tour.json +11 -5
  54. package/components/virtual-list.json +2 -2
  55. package/generated/catalog.js +117 -46
  56. package/generated/examples.json +29 -17
  57. package/index.json +1 -1
  58. package/package.json +1 -1
  59. package/snapshot/index.json +218 -137
  60. package/snapshot/items/components/accordion.json +4 -4
  61. package/snapshot/items/components/activity-heatmap.json +2 -2
  62. package/snapshot/items/components/alert.json +9 -3
  63. package/snapshot/items/components/app-shell.json +9 -3
  64. package/snapshot/items/components/avatar.json +2 -2
  65. package/snapshot/items/components/badge.json +2 -2
  66. package/snapshot/items/components/breadcrumb.json +2 -2
  67. package/snapshot/items/components/button.json +12 -3
  68. package/snapshot/items/components/calendar.json +2 -2
  69. package/snapshot/items/components/card.json +2 -2
  70. package/snapshot/items/components/carousel.json +10 -4
  71. package/snapshot/items/components/checkbox.json +2 -2
  72. package/snapshot/items/components/color-picker.json +3 -3
  73. package/snapshot/items/components/combobox.json +3 -3
  74. package/snapshot/items/components/command-menu.json +3 -3
  75. package/snapshot/items/components/context-menu.json +5 -5
  76. package/snapshot/items/components/copy-button.json +10 -2
  77. package/snapshot/items/components/date-picker.json +3 -3
  78. package/snapshot/items/components/dropdown-menu.json +3 -3
  79. package/snapshot/items/components/dropzone.json +1 -1
  80. package/snapshot/items/components/empty-state.json +2 -2
  81. package/snapshot/items/components/hover-card.json +4 -4
  82. package/snapshot/items/components/input.json +2 -2
  83. package/snapshot/items/components/kbd.json +1 -1
  84. package/snapshot/items/components/modal.json +17 -5
  85. package/snapshot/items/components/number-input.json +3 -3
  86. package/snapshot/items/components/otp-input.json +2 -2
  87. package/snapshot/items/components/pagination.json +2 -2
  88. package/snapshot/items/components/password-input.json +2 -2
  89. package/snapshot/items/components/popover.json +4 -4
  90. package/snapshot/items/components/priority-icon.json +1 -1
  91. package/snapshot/items/components/progress.json +8 -2
  92. package/snapshot/items/components/radio-group.json +1 -1
  93. package/snapshot/items/components/rating.json +1 -1
  94. package/snapshot/items/components/resizable.json +1 -1
  95. package/snapshot/items/components/segmented-control.json +2 -2
  96. package/snapshot/items/components/select.json +8 -6
  97. package/snapshot/items/components/sheet.json +17 -5
  98. package/snapshot/items/components/skeleton.json +1 -1
  99. package/snapshot/items/components/slider.json +6 -4
  100. package/snapshot/items/components/spinner.json +1 -1
  101. package/snapshot/items/components/status-icon.json +1 -1
  102. package/snapshot/items/components/stepper.json +2 -2
  103. package/snapshot/items/components/table.json +1 -1
  104. package/snapshot/items/components/tabs.json +3 -3
  105. package/snapshot/items/components/tag-input.json +3 -3
  106. package/snapshot/items/components/textarea.json +8 -2
  107. package/snapshot/items/components/time-picker.json +3 -3
  108. package/snapshot/items/components/timeline.json +2 -2
  109. package/snapshot/items/components/toast.json +2 -2
  110. package/snapshot/items/components/toggle.json +1 -1
  111. package/snapshot/items/components/tooltip.json +3 -3
  112. package/snapshot/items/components/tour.json +11 -5
  113. package/snapshot/items/components/virtual-list.json +2 -2
  114. package/snapshot/source/packages/components/_internal/dialog.ts +30 -35
  115. package/snapshot/source/packages/components/_internal/dom.ts +14 -0
  116. package/snapshot/source/packages/components/_internal/floating.ts +13 -16
  117. package/snapshot/source/packages/components/_internal/media.ts +34 -0
  118. package/snapshot/source/packages/components/_internal/react.ts +43 -0
  119. package/snapshot/source/packages/components/accordion/accordion.tsx +11 -7
  120. package/snapshot/source/packages/components/activity-heatmap/activity-heatmap.tsx +2 -1
  121. package/snapshot/source/packages/components/alert/alert.tsx +2 -1
  122. package/snapshot/source/packages/components/app-shell/app-shell.tsx +8 -16
  123. package/snapshot/source/packages/components/avatar/avatar.tsx +4 -3
  124. package/snapshot/source/packages/components/button/button.tsx +4 -1
  125. package/snapshot/source/packages/components/card/card.tsx +8 -4
  126. package/snapshot/source/packages/components/carousel/carousel.tsx +2 -9
  127. package/snapshot/source/packages/components/color-picker/color-picker.tsx +15 -12
  128. package/snapshot/source/packages/components/combobox/combobox.tsx +18 -13
  129. package/snapshot/source/packages/components/command-menu/command-menu.tsx +5 -5
  130. package/snapshot/source/packages/components/context-menu/context-menu.tsx +1 -1
  131. package/snapshot/source/packages/components/date-picker/date-picker.tsx +12 -9
  132. package/snapshot/source/packages/components/empty-state/empty-state.tsx +5 -3
  133. package/snapshot/source/packages/components/hover-card/hover-card.tsx +3 -7
  134. package/snapshot/source/packages/components/input/input.tsx +43 -5
  135. package/snapshot/source/packages/components/modal/modal.tsx +21 -9
  136. package/snapshot/source/packages/components/number-input/number-input.tsx +11 -7
  137. package/snapshot/source/packages/components/otp-input/otp-input.tsx +19 -10
  138. package/snapshot/source/packages/components/popover/popover.tsx +2 -1
  139. package/snapshot/source/packages/components/progress/progress.tsx +14 -11
  140. package/snapshot/source/packages/components/select/select.tsx +34 -11
  141. package/snapshot/source/packages/components/sheet/sheet.tsx +22 -11
  142. package/snapshot/source/packages/components/slider/slider.tsx +8 -8
  143. package/snapshot/source/packages/components/tabs/tabs.tsx +8 -7
  144. package/snapshot/source/packages/components/tag-input/tag-input.tsx +11 -7
  145. package/snapshot/source/packages/components/textarea/textarea.tsx +5 -4
  146. package/snapshot/source/packages/components/time-picker/time-picker.tsx +12 -9
  147. package/snapshot/source/packages/components/tooltip/tooltip.tsx +4 -3
  148. package/snapshot/source/packages/components/tour/tour.tsx +6 -8
  149. package/snapshot/source/packages/components/virtual-list/virtual-list.tsx +12 -15
  150. package/snapshot/source-manifest.json +36 -34
@@ -276,6 +276,9 @@
276
276
  "primary",
277
277
  "secondary",
278
278
  "subtle"
279
+ ],
280
+ "data-width": [
281
+ "full"
279
282
  ]
280
283
  }
281
284
  },
@@ -628,7 +631,7 @@
628
631
  "dropzone": {
629
632
  "needs": "script",
630
633
  "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Dropzone } from \"@/components/ui/dropzone\";\n\nexport default function Example() {\n const [files, setFiles] = React.useState<File[]>([]);\n return (\n <Dropzone\n label=\"Attachments\"\n hint={files.length ? `${files.length} selected` : \"PNG or PDF, up to 10 MB\"}\n accept=\"image/png,application/pdf\"\n maxSize={10 * 1024 * 1024}\n multiple\n onFiles={setFiles}\n />\n );\n}",
631
- "html": "<div class=\"ml-dropzone-root\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"dropzone-1\">Attachments</label>\n <div class=\"ml-dropzone\" id=\"dropzone-1\" role=\"button\" tabindex=\"0\" aria-label=\"Attachments: drop files here, or press Enter to choose\" aria-describedby=\"dropzone-1-hint\">\n <span class=\"ml-dropzone-icon\" aria-hidden=\"true\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M12 15V3m-5 5 5-5 5 5M5 21h14\" pathLength=\"1\"></path></svg></span>\n <span class=\"ml-dropzone-title\">Drop files here, or choose</span>\n <span class=\"ml-dropzone-rules\">PNG, PDF · up to 10.0 MB</span>\n <input type=\"file\" hidden=\"\" accept=\"image/png,application/pdf\" multiple=\"\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"dropzone-1-hint\">PNG or PDF, up to 10 MB</p>\n </div>\n</div>",
634
+ "html": "<div class=\"ml-dropzone-root\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"dropzone-1-label\" for=\"dropzone-1\">Attachments</label>\n <div class=\"ml-dropzone\" id=\"dropzone-1\" role=\"button\" tabindex=\"0\" aria-label=\"Attachments: drop files here, or press Enter to choose\" aria-describedby=\"dropzone-1-hint\">\n <span class=\"ml-dropzone-icon\" aria-hidden=\"true\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M12 15V3m-5 5 5-5 5 5M5 21h14\" pathLength=\"1\"></path></svg></span>\n <span class=\"ml-dropzone-title\">Drop files here, or choose</span>\n <span class=\"ml-dropzone-rules\">PNG, PDF · up to 10.0 MB</span>\n <input type=\"file\" hidden=\"\" accept=\"image/png,application/pdf\" multiple=\"\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"dropzone-1-hint\">PNG or PDF, up to 10 MB</p>\n </div>\n</div>",
632
635
  "elements": [
633
636
  {
634
637
  "class": "ml-dropzone-root",
@@ -731,7 +734,7 @@
731
734
  "input": {
732
735
  "needs": "nothing",
733
736
  "react": "import { Input } from \"@/components/ui/input\";\n\nexport default function Example() {\n return <Input label=\"Email\" type=\"email\" placeholder=\"you@company.com\" hint=\"We never share it.\" />;\n}",
734
- "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"input-1\">Email</label>\n <div class=\"ml-input-control\">\n <input class=\"ml-input\" id=\"input-1\" aria-describedby=\"input-1-hint\" data-variant=\"default\" data-size=\"md\" type=\"email\" placeholder=\"you@company.com\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"input-1-hint\">We never share it.</p>\n</div>",
737
+ "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"input-1-label\" for=\"input-1\">Email</label>\n <div class=\"ml-input-control\">\n <input class=\"ml-input\" id=\"input-1\" aria-describedby=\"input-1-hint\" data-variant=\"default\" data-size=\"md\" type=\"email\" placeholder=\"you@company.com\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"input-1-hint\">We never share it.</p>\n</div>",
735
738
  "elements": [
736
739
  {
737
740
  "class": "ml-input-field",
@@ -745,6 +748,7 @@
745
748
  "aria-invalid": [
746
749
  "true"
747
750
  ],
751
+ "data-invalid": [],
748
752
  "data-size": [
749
753
  "lg",
750
754
  "sm"
@@ -794,7 +798,7 @@
794
798
  "title": "With an error",
795
799
  "description": "The message names the fix, and is tied to the field so a screen reader reads it with the label.",
796
800
  "react": "import { Input } from \"@/components/ui/input\";\n\nexport default function Example() {\n return <Input label=\"Work email\" type=\"email\" defaultValue=\"lena@\" error=\"Enter the whole address, like lena@company.com.\" required />;\n}",
797
- "html": "<div class=\"ml-input-field\" data-invalid=\"\">\n <label class=\"ml-input-label\" for=\"input-1\">Work email<span class=\"ml-required-mark\" aria-hidden=\"true\">*</span></label>\n <div class=\"ml-input-control\">\n <input class=\"ml-input\" id=\"input-1\" required=\"\" aria-invalid=\"true\" aria-describedby=\"input-1-error\" data-variant=\"default\" data-size=\"md\" type=\"email\" value=\"lena@\"/>\n </div>\n <p class=\"ml-input-error\" id=\"input-1-error\" role=\"alert\">Enter the whole address, like lena@company.com.</p>\n</div>"
801
+ "html": "<div class=\"ml-input-field\" data-invalid=\"\">\n <label class=\"ml-input-label\" id=\"input-1-label\" for=\"input-1\">Work email<span class=\"ml-required-mark\" aria-hidden=\"true\">*</span></label>\n <div class=\"ml-input-control\">\n <input class=\"ml-input\" id=\"input-1\" required=\"\" aria-invalid=\"true\" aria-describedby=\"input-1-error\" data-variant=\"default\" data-size=\"md\" type=\"email\" value=\"lena@\"/>\n </div>\n <p class=\"ml-input-error\" id=\"input-1-error\" role=\"alert\">Enter the whole address, like lena@company.com.</p>\n</div>"
798
802
  },
799
803
  {
800
804
  "slug": "affixes",
@@ -802,7 +806,7 @@
802
806
  "title": "With an icon or a prefix",
803
807
  "description": "The text starts after whatever sits beside it, however wide it is.",
804
808
  "react": "import { IconSearch } from \"@mlola-ui/icons\";\nimport { Input } from \"@/components/ui/input\";\n\nexport default function Example() {\n return (\n <div className=\"ml-stack\">\n <Input label=\"Search\" type=\"search\" placeholder=\"Search projects\" leading={<IconSearch size=\"1em\" />} />\n <Input label=\"Website\" leading=\"https://\" placeholder=\"company.com\" />\n </div>\n );\n}",
805
- "html": "<div class=\"ml-stack\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"input-1\">Search</label>\n <div class=\"ml-input-control\" data-leading=\"\">\n <span class=\"ml-input-leading\" aria-hidden=\"true\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><circle cx=\"11\" cy=\"11\" r=\"7.5\" pathLength=\"1\"></circle><path d=\"m21 21-4.35-4.35\" pathLength=\"1\"></path></svg></span>\n <input class=\"ml-input\" id=\"input-1\" data-variant=\"default\" data-size=\"md\" type=\"search\" placeholder=\"Search projects\"/>\n </div>\n </div>\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"input-2\">Website</label>\n <div class=\"ml-input-control\" data-leading=\"\">\n <span class=\"ml-input-leading\" aria-hidden=\"true\">https://</span>\n <input class=\"ml-input\" id=\"input-2\" data-variant=\"default\" data-size=\"md\" placeholder=\"company.com\"/>\n </div>\n </div>\n</div>"
809
+ "html": "<div class=\"ml-stack\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"input-1-label\" for=\"input-1\">Search</label>\n <div class=\"ml-input-control\" data-leading=\"\">\n <span class=\"ml-input-leading\" aria-hidden=\"true\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><circle cx=\"11\" cy=\"11\" r=\"7.5\" pathLength=\"1\"></circle><path d=\"m21 21-4.35-4.35\" pathLength=\"1\"></path></svg></span>\n <input class=\"ml-input\" id=\"input-1\" data-variant=\"default\" data-size=\"md\" type=\"search\" placeholder=\"Search projects\"/>\n </div>\n </div>\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"input-2-label\" for=\"input-2\">Website</label>\n <div class=\"ml-input-control\" data-leading=\"\">\n <span class=\"ml-input-leading\" aria-hidden=\"true\">https://</span>\n <input class=\"ml-input\" id=\"input-2\" data-variant=\"default\" data-size=\"md\" placeholder=\"company.com\"/>\n </div>\n </div>\n</div>"
806
810
  }
807
811
  ]
808
812
  },
@@ -823,7 +827,7 @@
823
827
  },
824
828
  "modal": {
825
829
  "needs": "behavior",
826
- "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@/components/ui/modal\";\n\nexport default function Example() {\n const [open, setOpen] = React.useState(false);\n const close = () => setOpen(false);\n return (\n <>\n <Button variant=\"danger\" onClick={() => setOpen(true)}>Delete project</Button>\n <Modal open={open} onClose={close} size=\"sm\" role=\"alertdialog\" label=\"Delete project\">\n <ModalHeader title=\"Delete project\" onClose={close} />\n <ModalBody>This removes the project and every deployment attached to it.</ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={close}>Keep it</Button>\n <Button variant=\"danger\" onClick={close}>Delete</Button>\n </ModalFooter>\n </Modal>\n </>\n );\n}",
830
+ "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@/components/ui/modal\";\n\nexport default function Example() {\n const [open, setOpen] = React.useState(false);\n const close = () => setOpen(false);\n return (\n <>\n <Button variant=\"danger\" onClick={() => setOpen(true)}>Delete project</Button>\n <Modal open={open} onClose={close} size=\"sm\" role=\"alertdialog\">\n <ModalHeader title=\"Delete project\" onClose={close} />\n <ModalBody>This removes the project and every deployment attached to it.</ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={close}>Keep it</Button>\n <Button variant=\"danger\" onClick={close}>Delete</Button>\n </ModalFooter>\n </Modal>\n </>\n );\n}",
827
831
  "html": "<button class=\"ml-button\" type=\"button\" data-variant=\"danger\" data-size=\"md\"><span class=\"ml-button-label\">Delete project</span></button>",
828
832
  "behavior": {
829
833
  "name": "modal",
@@ -872,7 +876,7 @@
872
876
  "file": "1-form",
873
877
  "title": "A form in a dialog",
874
878
  "description": "Focus moves to the first field, stays inside, and returns to the button that opened it.",
875
- "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@/components/ui/modal\";\n\nexport default function Example() {\n const [open, setOpen] = React.useState(false);\n const close = () => setOpen(false);\n return (\n <>\n <Button onClick={() => setOpen(true)}>Invite teammate</Button>\n <Modal open={open} onClose={close} label=\"Invite teammate\">\n <form\n onSubmit={(event) => {\n event.preventDefault();\n close();\n }}\n >\n <ModalHeader title=\"Invite teammate\" onClose={close} />\n <ModalBody>\n <Input label=\"Email\" type=\"email\" name=\"email\" placeholder=\"teammate@company.com\" required />\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={close}>Cancel</Button>\n <Button type=\"submit\">Send invite</Button>\n </ModalFooter>\n </form>\n </Modal>\n </>\n );\n}",
879
+ "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Modal, ModalBody, ModalFooter, ModalHeader } from \"@/components/ui/modal\";\n\nexport default function Example() {\n const [open, setOpen] = React.useState(false);\n const close = () => setOpen(false);\n return (\n <>\n <Button onClick={() => setOpen(true)}>Invite teammate</Button>\n <Modal open={open} onClose={close}>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n close();\n }}\n >\n <ModalHeader title=\"Invite teammate\" onClose={close} />\n <ModalBody>\n <Input label=\"Email\" type=\"email\" name=\"email\" placeholder=\"teammate@company.com\" required />\n </ModalBody>\n <ModalFooter>\n <Button variant=\"secondary\" onClick={close}>Cancel</Button>\n <Button type=\"submit\">Send invite</Button>\n </ModalFooter>\n </form>\n </Modal>\n </>\n );\n}",
876
880
  "html": "<button class=\"ml-button\" type=\"button\" data-variant=\"primary\" data-size=\"md\"><span class=\"ml-button-label\">Invite teammate</span></button>"
877
881
  }
878
882
  ]
@@ -880,7 +884,7 @@
880
884
  "otp-input": {
881
885
  "needs": "script",
882
886
  "react": "import { OtpInput } from \"@/components/ui/otp-input\";\n\nexport default function Example() {\n return <OtpInput label=\"Verification code\" hint=\"Sent to your email.\" length={6} />;\n}",
883
- "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"otp-1\">Verification code</label>\n <div class=\"ml-otp\" role=\"group\" aria-label=\"Verification code\">\n <input class=\"ml-otp-box\" id=\"otp-1\" inputMode=\"numeric\" autoComplete=\"one-time-code\" aria-label=\"Digit 1 of 6\" aria-describedby=\"otp-1-hint\" maxLength=\"6\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 2 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 3 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 4 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 5 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 6 of 6\" maxLength=\"1\" value=\"\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"otp-1-hint\">Sent to your email.</p>\n</div>",
887
+ "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"otp-1-label\" for=\"otp-1\">Verification code</label>\n <div class=\"ml-otp\" role=\"group\" aria-labelledby=\"otp-1-label\">\n <input class=\"ml-otp-box\" id=\"otp-1\" inputMode=\"numeric\" autoComplete=\"one-time-code\" aria-label=\"Digit 1 of 6\" aria-describedby=\"otp-1-hint\" maxLength=\"6\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 2 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 3 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 4 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 5 of 6\" maxLength=\"1\" value=\"\"/>\n <input class=\"ml-otp-box\" inputMode=\"numeric\" autoComplete=\"off\" aria-label=\"Digit 6 of 6\" maxLength=\"1\" value=\"\"/>\n </div>\n <p class=\"ml-input-hint\" id=\"otp-1-hint\">Sent to your email.</p>\n</div>",
884
888
  "elements": [
885
889
  {
886
890
  "class": "ml-otp",
@@ -1309,6 +1313,14 @@
1309
1313
  "description": "multiple collects values as chips; clearable empties them at once.",
1310
1314
  "react": "import { Select } from \"@/components/ui/select\";\n\nexport default function Example() {\n return (\n <Select\n label=\"Notify\"\n multiple\n clearable\n defaultValue={[\"design\", \"billing\"]}\n options={[\n { value: \"design\", label: \"Design\" },\n { value: \"engineering\", label: \"Engineering\" },\n { value: \"billing\", label: \"Billing\" },\n { value: \"support\", label: \"Support\" },\n ]}\n />\n );\n}",
1311
1315
  "html": "<div class=\"ml-select-root\">\n <span class=\"ml-select-label\" id=\"select-multiple-1-label\">Notify</span>\n <div class=\"ml-select-control\">\n <button class=\"ml-select\" type=\"button\" role=\"combobox\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-labelledby=\"select-multiple-1-label\" data-size=\"md\" data-state=\"closed\"><span class=\"ml-select-value\"><span class=\"ml-select-chips\"><span class=\"ml-badge\" data-size=\"sm\">Design</span><span class=\"ml-badge\" data-size=\"sm\">Billing</span></span></span><svg class=\"mlola-glyph ml-select-chevron\" width=\"1.125em\" height=\"1.125em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg></button>\n <button class=\"ml-select-clear\" type=\"button\" aria-label=\"Clear Notify\" data-hit=\"expand\"><svg class=\"mlola-glyph\" width=\"0.875em\" height=\"0.875em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>"
1316
+ },
1317
+ {
1318
+ "slug": "in-a-form",
1319
+ "file": "3-in-a-form",
1320
+ "title": "In a form",
1321
+ "description": "name submits the value like a native select; id lets a label elsewhere in the form name it.",
1322
+ "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Select } from \"@/components/ui/select\";\n\nexport default function Example() {\n const [sent, setSent] = React.useState(\"\");\n return (\n <form\n onSubmit={(event) => {\n event.preventDefault();\n setSent(`Saved: ${new FormData(event.currentTarget).get(\"visibility\")}`);\n }}\n >\n <label htmlFor=\"visibility\" className=\"ml-input-label\">\n Who can see this project\n </label>\n <Select\n id=\"visibility\"\n name=\"visibility\"\n required\n defaultValue=\"team\"\n options={[\n { value: \"private\", label: \"Only me\" },\n { value: \"team\", label: \"My team\" },\n { value: \"public\", label: \"Anyone with the link\" },\n ]}\n />\n <Button type=\"submit\">Save</Button>\n <p role=\"status\">{sent}</p>\n </form>\n );\n}",
1323
+ "html": "<form>\n <label class=\"ml-input-label\" for=\"visibility\">Who can see this project</label>\n <div class=\"ml-select-root\">\n <input type=\"hidden\" name=\"visibility\" value=\"team\"/>\n <div class=\"ml-select-control\">\n <button class=\"ml-select\" id=\"visibility\" type=\"button\" role=\"combobox\" aria-haspopup=\"listbox\" aria-expanded=\"false\" aria-required=\"true\" data-size=\"md\" data-state=\"closed\"><span class=\"ml-select-value\">My team</span><svg class=\"mlola-glyph ml-select-chevron\" width=\"1.125em\" height=\"1.125em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg></button>\n </div>\n </div>\n <button class=\"ml-button\" type=\"submit\" data-variant=\"primary\" data-size=\"md\"><span class=\"ml-button-label\">Save</span></button>\n <p role=\"status\"></p>\n</form>"
1312
1324
  }
1313
1325
  ]
1314
1326
  },
@@ -1616,7 +1628,7 @@
1616
1628
  "textarea": {
1617
1629
  "needs": "nothing",
1618
1630
  "react": "import { Textarea } from \"@/components/ui/textarea\";\n\nexport default function Example() {\n return <Textarea label=\"Feedback\" hint=\"What would make this better?\" maxLength={280} showCount rows={3} />;\n}",
1619
- "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"textarea-1\">Feedback</label>\n <textarea class=\"ml-textarea\" id=\"textarea-1\" rows=\"3\" maxLength=\"280\" aria-describedby=\"textarea-1-hint\" style=\"--ml-textarea-max-rows:12\"></textarea>\n <p class=\"ml-textarea-count\" aria-live=\"polite\">0 / 280</p>\n <p class=\"ml-input-hint\" id=\"textarea-1-hint\">What would make this better?</p>\n</div>",
1631
+ "html": "<div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"textarea-1-label\" for=\"textarea-1\">Feedback</label>\n <textarea class=\"ml-textarea\" id=\"textarea-1\" rows=\"3\" maxLength=\"280\" aria-describedby=\"textarea-1-hint\" style=\"--ml-textarea-max-rows:12\"></textarea>\n <p class=\"ml-textarea-count\" aria-live=\"polite\">0 / 280</p>\n <p class=\"ml-input-hint\" id=\"textarea-1-hint\">What would make this better?</p>\n</div>",
1620
1632
  "elements": [
1621
1633
  {
1622
1634
  "class": "ml-textarea",
@@ -2004,7 +2016,7 @@
2004
2016
  "date-picker": {
2005
2017
  "needs": "script",
2006
2018
  "react": "import { DatePicker } from \"@/components/ui/date-picker\";\n\nexport default function Example() {\n return <DatePicker label=\"Start date\" defaultValue=\"2026-09-18\" today=\"2026-09-14\" clearable />;\n}",
2007
- "html": "<div class=\"ml-input-field ml-date-picker\">\n <label class=\"ml-input-label\" for=\"date-picker-1\">Start date</label>\n <div class=\"ml-date-picker-control\">\n <button class=\"ml-input ml-date-picker-trigger\" id=\"date-picker-1\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph ml-date-picker-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" pathLength=\"1\"></rect><path d=\"M8 3v4M16 3v4M3 10h18\" pathLength=\"1\"></path></svg><span class=\"ml-date-picker-value\">Sep 18, 2026</span></button>\n <button class=\"ml-date-picker-clear\" type=\"button\" data-hit=\"expand\" aria-label=\"Clear date\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>",
2019
+ "html": "<div class=\"ml-input-field ml-date-picker\">\n <label class=\"ml-input-label\" id=\"date-picker-1-label\" for=\"date-picker-1\">Start date</label>\n <div class=\"ml-date-picker-control\">\n <button class=\"ml-input ml-date-picker-trigger\" id=\"date-picker-1\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph ml-date-picker-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" pathLength=\"1\"></rect><path d=\"M8 3v4M16 3v4M3 10h18\" pathLength=\"1\"></path></svg><span class=\"ml-date-picker-value\">Sep 18, 2026</span></button>\n <button class=\"ml-date-picker-clear\" type=\"button\" data-hit=\"expand\" aria-label=\"Clear date\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>",
2008
2020
  "elements": [
2009
2021
  {
2010
2022
  "class": "ml-date-picker",
@@ -2069,14 +2081,14 @@
2069
2081
  "title": "A range with presets",
2070
2082
  "description": "Presets cover the common ranges; the calendar covers the rest.",
2071
2083
  "react": "import { DatePicker } from \"@/components/ui/date-picker\";\n\nexport default function Example() {\n return (\n <DatePicker\n mode=\"range\"\n label=\"Report period\"\n today=\"2026-09-14\"\n defaultValue={{ from: \"2026-09-01\", to: \"2026-09-14\" }}\n presets={[\n { label: \"Last 7 days\", value: { from: \"2026-09-08\", to: \"2026-09-14\" } },\n { label: \"This month\", value: { from: \"2026-09-01\", to: \"2026-09-30\" } },\n ]}\n />\n );\n}",
2072
- "html": "<div class=\"ml-input-field ml-date-picker\">\n <label class=\"ml-input-label\" for=\"date-picker-range-1\">Report period</label>\n <div class=\"ml-date-picker-control\">\n <button class=\"ml-input ml-date-picker-trigger\" id=\"date-picker-range-1\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph ml-date-picker-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" pathLength=\"1\"></rect><path d=\"M8 3v4M16 3v4M3 10h18\" pathLength=\"1\"></path></svg><span class=\"ml-date-picker-value\">Sep 1, 2026 – Sep 14, 2026</span></button>\n <button class=\"ml-date-picker-clear\" type=\"button\" data-hit=\"expand\" aria-label=\"Clear date\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>"
2084
+ "html": "<div class=\"ml-input-field ml-date-picker\">\n <label class=\"ml-input-label\" id=\"date-picker-range-1-label\" for=\"date-picker-range-1\">Report period</label>\n <div class=\"ml-date-picker-control\">\n <button class=\"ml-input ml-date-picker-trigger\" id=\"date-picker-range-1\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph ml-date-picker-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" pathLength=\"1\"></rect><path d=\"M8 3v4M16 3v4M3 10h18\" pathLength=\"1\"></path></svg><span class=\"ml-date-picker-value\">Sep 1, 2026 – Sep 14, 2026</span></button>\n <button class=\"ml-date-picker-clear\" type=\"button\" data-hit=\"expand\" aria-label=\"Clear date\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>"
2073
2085
  }
2074
2086
  ]
2075
2087
  },
2076
2088
  "time-picker": {
2077
2089
  "needs": "script",
2078
2090
  "react": "import { TimePicker } from \"@/components/ui/time-picker\";\n\nexport default function Example() {\n return <TimePicker label=\"Reminder\" defaultValue=\"09:30\" step={15} hourCycle={24} />;\n}",
2079
- "html": "<div class=\"ml-input-field ml-time-picker\">\n <label class=\"ml-input-label\" for=\"time-picker-1\">Reminder</label>\n <div class=\"ml-input ml-time-picker-control\" role=\"group\" id=\"time-picker-1\" aria-label=\"Reminder\">\n <span class=\"ml-time-picker-segment\" role=\"spinbutton\" tabindex=\"0\" aria-label=\"Hours\" aria-valuemin=\"0\" aria-valuemax=\"23\" aria-valuenow=\"9\" aria-valuetext=\"09\">09</span>\n <span class=\"ml-time-picker-colon\" aria-hidden=\"true\">:</span>\n <span class=\"ml-time-picker-segment\" role=\"spinbutton\" tabindex=\"0\" aria-label=\"Minutes\" aria-valuemin=\"0\" aria-valuemax=\"59\" aria-valuenow=\"30\" aria-valuetext=\"30\">30</span>\n <button class=\"ml-time-picker-open\" type=\"button\" aria-label=\"Choose from a list\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><circle cx=\"12\" cy=\"12\" r=\"9.5\" pathLength=\"1\"></circle><path d=\"M12 7v5l3 2\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>",
2091
+ "html": "<div class=\"ml-input-field ml-time-picker\">\n <label class=\"ml-input-label\" id=\"time-picker-1-label\" for=\"time-picker-1\">Reminder</label>\n <div class=\"ml-input ml-time-picker-control\" role=\"group\" id=\"time-picker-1\" aria-labelledby=\"time-picker-1-label\">\n <span class=\"ml-time-picker-segment\" role=\"spinbutton\" tabindex=\"0\" aria-label=\"Hours\" aria-valuemin=\"0\" aria-valuemax=\"23\" aria-valuenow=\"9\" aria-valuetext=\"09\">09</span>\n <span class=\"ml-time-picker-colon\" aria-hidden=\"true\">:</span>\n <span class=\"ml-time-picker-segment\" role=\"spinbutton\" tabindex=\"0\" aria-label=\"Minutes\" aria-valuemin=\"0\" aria-valuemax=\"59\" aria-valuenow=\"30\" aria-valuetext=\"30\">30</span>\n <button class=\"ml-time-picker-open\" type=\"button\" aria-label=\"Choose from a list\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><circle cx=\"12\" cy=\"12\" r=\"9.5\" pathLength=\"1\"></circle><path d=\"M12 7v5l3 2\" pathLength=\"1\"></path></svg></button>\n </div>\n</div>",
2080
2092
  "elements": [
2081
2093
  {
2082
2094
  "class": "ml-time-picker",
@@ -2157,7 +2169,7 @@
2157
2169
  "combobox": {
2158
2170
  "needs": "script",
2159
2171
  "react": "import { Combobox } from \"@/components/ui/combobox\";\n\nexport default function Example() {\n return (\n <Combobox\n label=\"Framework\"\n placeholder=\"Search frameworks\"\n clearable\n options={[\n { value: \"next\", label: \"Next.js\" },\n { value: \"remix\", label: \"Remix\" },\n { value: \"astro\", label: \"Astro\" },\n ]}\n />\n );\n}",
2160
- "html": "<div class=\"ml-input-field ml-combobox\">\n <label class=\"ml-input-label\" for=\"combobox-1\">Framework</label>\n <div class=\"ml-combobox-control\">\n <input class=\"ml-input ml-combobox-input\" id=\"combobox-1\" role=\"combobox\" aria-expanded=\"false\" aria-controls=\"combobox-1-list\" aria-autocomplete=\"list\" placeholder=\"Search frameworks\" autoComplete=\"off\" spellCheck=\"false\" value=\"\"/>\n <svg class=\"mlola-glyph ml-combobox-chevron\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg>\n </div>\n</div>",
2172
+ "html": "<div class=\"ml-input-field ml-combobox\">\n <label class=\"ml-input-label\" id=\"combobox-1-label\" for=\"combobox-1\">Framework</label>\n <div class=\"ml-combobox-control\">\n <input class=\"ml-input ml-combobox-input\" id=\"combobox-1\" role=\"combobox\" aria-expanded=\"false\" aria-controls=\"combobox-1-list\" aria-autocomplete=\"list\" placeholder=\"Search frameworks\" autoComplete=\"off\" spellCheck=\"false\" value=\"\"/>\n <svg class=\"mlola-glyph ml-combobox-chevron\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg>\n </div>\n</div>",
2161
2173
  "elements": [
2162
2174
  {
2163
2175
  "class": "ml-combobox",
@@ -2249,14 +2261,14 @@
2249
2261
  "title": "Create what is missing",
2250
2262
  "description": "When the search finds nothing, the typed text can become a new option.",
2251
2263
  "react": "\"use client\";\n\nimport * as React from \"react\";\nimport { Combobox } from \"@/components/ui/combobox\";\n\nexport default function Example() {\n const [options, setOptions] = React.useState([\n { value: \"design\", label: \"Design\" },\n { value: \"research\", label: \"Research\" },\n ]);\n const [value, setValue] = React.useState<string | null>(null);\n return (\n <Combobox\n label=\"Label\"\n placeholder=\"Find or create a label\"\n options={options}\n value={value}\n onValueChange={setValue}\n onCreate={(text) => {\n const option = { value: text.toLowerCase(), label: text };\n setOptions((all) => [...all, option]);\n setValue(option.value);\n }}\n />\n );\n}",
2252
- "html": "<div class=\"ml-input-field ml-combobox\">\n <label class=\"ml-input-label\" for=\"combobox-create-1\">Label</label>\n <div class=\"ml-combobox-control\">\n <input class=\"ml-input ml-combobox-input\" id=\"combobox-create-1\" role=\"combobox\" aria-expanded=\"false\" aria-controls=\"combobox-create-1-list\" aria-autocomplete=\"list\" placeholder=\"Find or create a label\" autoComplete=\"off\" spellCheck=\"false\" value=\"\"/>\n <svg class=\"mlola-glyph ml-combobox-chevron\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg>\n </div>\n</div>"
2264
+ "html": "<div class=\"ml-input-field ml-combobox\">\n <label class=\"ml-input-label\" id=\"combobox-create-1-label\" for=\"combobox-create-1\">Label</label>\n <div class=\"ml-combobox-control\">\n <input class=\"ml-input ml-combobox-input\" id=\"combobox-create-1\" role=\"combobox\" aria-expanded=\"false\" aria-controls=\"combobox-create-1-list\" aria-autocomplete=\"list\" placeholder=\"Find or create a label\" autoComplete=\"off\" spellCheck=\"false\" value=\"\"/>\n <svg class=\"mlola-glyph ml-combobox-chevron\" width=\"1.1em\" height=\"1.1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><polyline points=\"6 9 12 15 18 9\" pathLength=\"1\"></polyline></svg>\n </div>\n</div>"
2253
2265
  }
2254
2266
  ]
2255
2267
  },
2256
2268
  "tag-input": {
2257
2269
  "needs": "script",
2258
2270
  "react": "import { TagInput } from \"@/components/ui/tag-input\";\n\nexport default function Example() {\n return <TagInput label=\"Labels\" defaultValue={[\"design\", \"billing\"]} placeholder=\"Add a label\" max={5} />;\n}",
2259
- "html": "<div class=\"ml-input-field ml-tag-input\">\n <label class=\"ml-input-label\" for=\"tag-input-1\">Labels</label>\n <div class=\"ml-tag-input-control\">\n <ul class=\"ml-tag-input-tags\" aria-label=\"Added\">\n <li class=\"ml-tag-input-tag\">\n <span class=\"ml-tag-input-text\">design</span>\n <button class=\"ml-tag-input-remove\" type=\"button\" data-hit=\"expand\" tabindex=\"-1\" aria-label=\"Remove design\"><svg class=\"mlola-glyph\" width=\"0.8em\" height=\"0.8em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </li>\n <li class=\"ml-tag-input-tag\">\n <span class=\"ml-tag-input-text\">billing</span>\n <button class=\"ml-tag-input-remove\" type=\"button\" data-hit=\"expand\" tabindex=\"-1\" aria-label=\"Remove billing\"><svg class=\"mlola-glyph\" width=\"0.8em\" height=\"0.8em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </li>\n </ul>\n <input class=\"ml-tag-input-field\" id=\"tag-input-1\" placeholder=\"Add a label\" autoComplete=\"off\" value=\"\"/>\n <span class=\"ml-tag-input-count\" aria-hidden=\"true\">2/5</span>\n </div>\n <p class=\"ml-visually-hidden\" role=\"status\" aria-live=\"polite\"></p>\n</div>",
2271
+ "html": "<div class=\"ml-input-field ml-tag-input\">\n <label class=\"ml-input-label\" id=\"tag-input-1-label\" for=\"tag-input-1\">Labels</label>\n <div class=\"ml-tag-input-control\">\n <ul class=\"ml-tag-input-tags\" aria-label=\"Added\">\n <li class=\"ml-tag-input-tag\">\n <span class=\"ml-tag-input-text\">design</span>\n <button class=\"ml-tag-input-remove\" type=\"button\" data-hit=\"expand\" tabindex=\"-1\" aria-label=\"Remove design\"><svg class=\"mlola-glyph\" width=\"0.8em\" height=\"0.8em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </li>\n <li class=\"ml-tag-input-tag\">\n <span class=\"ml-tag-input-text\">billing</span>\n <button class=\"ml-tag-input-remove\" type=\"button\" data-hit=\"expand\" tabindex=\"-1\" aria-label=\"Remove billing\"><svg class=\"mlola-glyph\" width=\"0.8em\" height=\"0.8em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M18 6 6 18M6 6l12 12\" pathLength=\"1\"></path></svg></button>\n </li>\n </ul>\n <input class=\"ml-tag-input-field\" id=\"tag-input-1\" placeholder=\"Add a label\" autoComplete=\"off\" value=\"\"/>\n <span class=\"ml-tag-input-count\" aria-hidden=\"true\">2/5</span>\n </div>\n <p class=\"ml-visually-hidden\" role=\"status\" aria-live=\"polite\"></p>\n</div>",
2260
2272
  "elements": [
2261
2273
  {
2262
2274
  "class": "ml-tag-input",
@@ -2300,7 +2312,7 @@
2300
2312
  "number-input": {
2301
2313
  "needs": "script",
2302
2314
  "react": "import { NumberInput } from \"@/components/ui/number-input\";\n\nexport default function Example() {\n return <NumberInput label=\"Seats\" defaultValue={5} min={1} max={50} hint=\"Up to 50 on this plan.\" locale=\"en-US\" />;\n}",
2303
- "html": "<div class=\"ml-input-field ml-number-input\">\n <label class=\"ml-input-label\" for=\"number-input-1\">Seats</label>\n <div class=\"ml-number-input-control\">\n <input class=\"ml-number-input-field\" id=\"number-input-1\" role=\"spinbutton\" inputMode=\"decimal\" autoComplete=\"off\" aria-valuenow=\"5\" aria-valuemin=\"1\" aria-valuemax=\"50\" aria-valuetext=\"5\" aria-describedby=\"number-input-1-hint\" value=\"5\"/>\n <span class=\"ml-number-input-buttons\"><button class=\"ml-number-input-step\" type=\"button\" tabindex=\"-1\" aria-label=\"Decrease\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M5 12h14\" pathLength=\"1\"></path></svg></button><button class=\"ml-number-input-step\" type=\"button\" tabindex=\"-1\" aria-label=\"Increase\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M12 5v14M5 12h14\" pathLength=\"1\"></path></svg></button></span>\n </div>\n <p class=\"ml-input-hint\" id=\"number-input-1-hint\">Up to 50 on this plan.</p>\n</div>",
2315
+ "html": "<div class=\"ml-input-field ml-number-input\">\n <label class=\"ml-input-label\" id=\"number-input-1-label\" for=\"number-input-1\">Seats</label>\n <div class=\"ml-number-input-control\">\n <input class=\"ml-number-input-field\" id=\"number-input-1\" role=\"spinbutton\" inputMode=\"decimal\" autoComplete=\"off\" aria-valuenow=\"5\" aria-valuemin=\"1\" aria-valuemax=\"50\" aria-valuetext=\"5\" aria-describedby=\"number-input-1-hint\" value=\"5\"/>\n <span class=\"ml-number-input-buttons\"><button class=\"ml-number-input-step\" type=\"button\" tabindex=\"-1\" aria-label=\"Decrease\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M5 12h14\" pathLength=\"1\"></path></svg></button><button class=\"ml-number-input-step\" type=\"button\" tabindex=\"-1\" aria-label=\"Increase\"><svg class=\"mlola-glyph\" width=\"0.9em\" height=\"0.9em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M12 5v14M5 12h14\" pathLength=\"1\"></path></svg></button></span>\n </div>\n <p class=\"ml-input-hint\" id=\"number-input-1-hint\">Up to 50 on this plan.</p>\n</div>",
2304
2316
  "elements": [
2305
2317
  {
2306
2318
  "class": "ml-number-input",
@@ -2330,7 +2342,7 @@
2330
2342
  "color-picker": {
2331
2343
  "needs": "script",
2332
2344
  "react": "import { ColorPicker } from \"@/components/ui/color-picker\";\n\nexport default function Example() {\n return <ColorPicker label=\"Brand color\" defaultValue=\"oklch(0.62 0.19 255)\" format=\"oklch\" />;\n}",
2333
- "html": "<div class=\"ml-input-field ml-color-picker\">\n <label class=\"ml-input-label\" for=\"color-picker-1\">Brand color</label>\n <button class=\"ml-input ml-color-picker-trigger\" id=\"color-picker-1\" type=\"button\" aria-label=\"Brand color: oklch(61.9% 0.191 255.2)\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><span class=\"ml-color-picker-swatch\" style=\"--ml-color:rgb(29 132 245)\" aria-hidden=\"true\"></span><span class=\"ml-color-picker-value\">oklch(61.9% 0.191 255.2)</span></button>\n</div>",
2345
+ "html": "<div class=\"ml-input-field ml-color-picker\">\n <label class=\"ml-input-label\" id=\"color-picker-1-label\" for=\"color-picker-1\">Brand color</label>\n <button class=\"ml-input ml-color-picker-trigger\" id=\"color-picker-1\" type=\"button\" aria-label=\"Brand color: oklch(61.9% 0.191 255.2)\" aria-haspopup=\"dialog\" aria-expanded=\"false\"><span class=\"ml-color-picker-swatch\" style=\"--ml-color:rgb(29 132 245)\" aria-hidden=\"true\"></span><span class=\"ml-color-picker-value\">oklch(61.9% 0.191 255.2)</span></button>\n</div>",
2334
2346
  "elements": [
2335
2347
  {
2336
2348
  "class": "ml-color-picker",
@@ -2770,7 +2782,7 @@
2770
2782
  "password-input": {
2771
2783
  "needs": "script",
2772
2784
  "react": "import { PasswordInput } from \"@/components/ui/password-input\";\n\nexport default function Example() {\n return <PasswordInput label=\"New password\" name=\"password\" strength />;\n}",
2773
- "html": "<div class=\"ml-password-input\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" for=\"input-2\">New password</label>\n <div class=\"ml-input-control\" data-trailing=\"\">\n <input class=\"ml-input\" id=\"input-2\" aria-describedby=\"password-input-1\" data-variant=\"default\" data-size=\"md\" type=\"password\" autoComplete=\"new-password\" autoCapitalize=\"none\" autoCorrect=\"off\" spellCheck=\"false\" name=\"password\"/>\n <span class=\"ml-input-trailing\"><button class=\"ml-password-input-toggle\" type=\"button\" aria-label=\"Show password\" aria-pressed=\"false\" data-hit=\"expand\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" pathLength=\"1\"></path><circle cx=\"12\" cy=\"12\" r=\"3\" pathLength=\"1\"></circle></svg></button></span>\n </div>\n </div>\n <div class=\"ml-password-input-strength\" id=\"password-input-1\" data-strength=\"empty\" aria-live=\"polite\">\n <span class=\"ml-password-input-meter\" aria-hidden=\"true\"><span></span><span></span><span></span></span>\n <p>Use 8 or more characters.</p>\n </div>\n</div>",
2785
+ "html": "<div class=\"ml-password-input\">\n <div class=\"ml-input-field\">\n <label class=\"ml-input-label\" id=\"input-2-label\" for=\"input-2\">New password</label>\n <div class=\"ml-input-control\" data-trailing=\"\">\n <input class=\"ml-input\" id=\"input-2\" aria-describedby=\"password-input-1\" data-variant=\"default\" data-size=\"md\" type=\"password\" autoComplete=\"new-password\" autoCapitalize=\"none\" autoCorrect=\"off\" spellCheck=\"false\" name=\"password\"/>\n <span class=\"ml-input-trailing\"><button class=\"ml-password-input-toggle\" type=\"button\" aria-label=\"Show password\" aria-pressed=\"false\" data-hit=\"expand\"><svg class=\"mlola-glyph\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"var(--mlola-glyph-stroke, var(--ml-icon-stroke, 1.75))\" stroke-linecap=\"round\" stroke-linejoin=\"round\" focusable=\"false\" aria-hidden=\"true\" data-optical-size=\"default\" style=\"color:var(--mlola-glyph-color, currentColor);scale:var(--mlola-glyph-optical-scale, 1);transform-origin:center\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" pathLength=\"1\"></path><circle cx=\"12\" cy=\"12\" r=\"3\" pathLength=\"1\"></circle></svg></button></span>\n </div>\n </div>\n <div class=\"ml-password-input-strength\" id=\"password-input-1\" data-strength=\"empty\" aria-live=\"polite\">\n <span class=\"ml-password-input-meter\" aria-hidden=\"true\"><span></span><span></span><span></span></span>\n <p>Use 8 or more characters.</p>\n </div>\n</div>",
2774
2786
  "elements": [
2775
2787
  {
2776
2788
  "class": "ml-password-input",
package/index.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "$schema": "./schema/registry-index.schema.json",
3
3
  "schemaVersion": 2,
4
4
  "name": "mlola-ui",
5
- "version": "1.0.13",
5
+ "version": "1.1.0",
6
6
  "homepage": "https://ui.mlola.com",
7
7
  "themeContract": {
8
8
  "attribute": "data-theme",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mlola-ui/registry",
3
- "version": "1.0.13",
3
+ "version": "1.1.0",
4
4
  "description": "Validated Registry v2 metadata and source snapshot for Mlola UI",
5
5
  "type": "module",
6
6
  "main": "./snapshot/index.json",