@adea-ai/ui 0.99.1 → 0.99.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 (89) hide show
  1. package/dist/components/layout/orbit-layout/orbit-layout.d.ts +5 -1
  2. package/dist/components/layout/orbit-layout/orbit-layout.d.ts.map +1 -1
  3. package/dist/components/layout/orbit-layout/orbit-layout.js.map +1 -1
  4. package/dist/components/layout/side-rail/side-rail.d.ts +4 -1
  5. package/dist/components/layout/side-rail/side-rail.d.ts.map +1 -1
  6. package/dist/components/layout/side-rail/side-rail.js +58 -64
  7. package/dist/components/layout/side-rail/side-rail.js.map +1 -1
  8. package/dist/components/layout/sidebar-nav/sidebar-nav.js +2 -2
  9. package/dist/components/layout/sidebar-nav/sidebar-nav.js.map +1 -1
  10. package/dist/components/motion/presence.d.ts +17 -7
  11. package/dist/components/motion/presence.d.ts.map +1 -1
  12. package/dist/components/motion/presence.js.map +1 -1
  13. package/dist/components/theme/theme-picker.d.ts.map +1 -1
  14. package/dist/components/theme/theme-picker.js +1 -1
  15. package/dist/components/theme/theme-picker.js.map +1 -1
  16. package/dist/components/theme/theme-provider.d.ts.map +1 -1
  17. package/dist/components/theme/theme-provider.js +15 -4
  18. package/dist/components/theme/theme-provider.js.map +1 -1
  19. package/dist/components/ui/aspect-ratio/aspect-ratio.d.ts +2 -2
  20. package/dist/components/ui/aspect-ratio/aspect-ratio.d.ts.map +1 -1
  21. package/dist/components/ui/aspect-ratio/aspect-ratio.js +15 -1
  22. package/dist/components/ui/aspect-ratio/aspect-ratio.js.map +1 -1
  23. package/dist/components/ui/badge/badge.d.ts +1 -1
  24. package/dist/components/ui/button/button.d.ts +1 -1
  25. package/dist/components/ui/calendar/calendar.d.ts.map +1 -1
  26. package/dist/components/ui/calendar/calendar.js +1 -1
  27. package/dist/components/ui/calendar/calendar.js.map +1 -1
  28. package/dist/components/ui/card/card.d.ts +2 -2
  29. package/dist/components/ui/card/card.js +2 -2
  30. package/dist/components/ui/card/card.js.map +1 -1
  31. package/dist/components/ui/chart/chart-options.d.ts +50 -0
  32. package/dist/components/ui/chart/chart-options.d.ts.map +1 -0
  33. package/dist/components/ui/chart/chart-options.js +178 -0
  34. package/dist/components/ui/chart/chart-options.js.map +1 -0
  35. package/dist/components/ui/chart/chart.d.ts +21 -18
  36. package/dist/components/ui/chart/chart.d.ts.map +1 -1
  37. package/dist/components/ui/chart/chart.js +175 -155
  38. package/dist/components/ui/chart/chart.js.map +1 -1
  39. package/dist/components/ui/chart/index.js +2 -1
  40. package/dist/components/ui/input-otp/input-otp.d.ts.map +1 -1
  41. package/dist/components/ui/input-otp/input-otp.js +2 -2
  42. package/dist/components/ui/input-otp/input-otp.js.map +1 -1
  43. package/dist/components/ui/pagination/pagination.d.ts.map +1 -1
  44. package/dist/components/ui/pagination/pagination.js +1 -1
  45. package/dist/components/ui/pagination/pagination.js.map +1 -1
  46. package/dist/components/ui/resizable/resizable.d.ts +0 -12
  47. package/dist/components/ui/resizable/resizable.d.ts.map +1 -1
  48. package/dist/components/ui/resizable/resizable.js +43 -9
  49. package/dist/components/ui/resizable/resizable.js.map +1 -1
  50. package/dist/lib/cn-tables.generated.js +10 -10
  51. package/dist/lib/cn-tables.generated.js.map +1 -1
  52. package/dist/r/chart.json +5 -0
  53. package/dist/r/registry.json +5 -0
  54. package/dist/r/src/components/layout/orbit-layout/orbit-layout.tsx +5 -1
  55. package/dist/r/src/components/layout/side-rail/side-rail.tsx +29 -16
  56. package/dist/r/src/components/layout/sidebar-nav/sidebar-nav.tsx +2 -2
  57. package/dist/r/src/components/motion/presence.tsx +17 -7
  58. package/dist/r/src/components/theme/theme-picker.tsx +5 -1
  59. package/dist/r/src/components/theme/theme-provider.tsx +19 -9
  60. package/dist/r/src/components/ui/aspect-ratio/aspect-ratio.tsx +14 -3
  61. package/dist/r/src/components/ui/calendar/calendar.tsx +6 -1
  62. package/dist/r/src/components/ui/card/card.tsx +2 -2
  63. package/dist/r/src/components/ui/chart/chart-options.ts +196 -0
  64. package/dist/r/src/components/ui/chart/chart.tsx +149 -101
  65. package/dist/r/src/components/ui/input-otp/input-otp.tsx +14 -2
  66. package/dist/r/src/components/ui/pagination/pagination.tsx +8 -1
  67. package/dist/r/src/components/ui/resizable/resizable.tsx +46 -8
  68. package/dist/r/src/lib/cn-tables.generated.ts +10 -10
  69. package/dist/r/src/styles/base.css +4 -1
  70. package/dist/r/src/styles/theme.css +23 -43
  71. package/package.json +1 -1
  72. package/registry.json +5 -0
  73. package/src/components/layout/orbit-layout/orbit-layout.tsx +5 -1
  74. package/src/components/layout/side-rail/side-rail.tsx +29 -16
  75. package/src/components/layout/sidebar-nav/sidebar-nav.tsx +2 -2
  76. package/src/components/motion/presence.tsx +17 -7
  77. package/src/components/theme/theme-picker.tsx +5 -1
  78. package/src/components/theme/theme-provider.tsx +19 -9
  79. package/src/components/ui/aspect-ratio/aspect-ratio.tsx +14 -3
  80. package/src/components/ui/calendar/calendar.tsx +6 -1
  81. package/src/components/ui/card/card.tsx +2 -2
  82. package/src/components/ui/chart/chart-options.ts +196 -0
  83. package/src/components/ui/chart/chart.tsx +149 -101
  84. package/src/components/ui/input-otp/input-otp.tsx +14 -2
  85. package/src/components/ui/pagination/pagination.tsx +8 -1
  86. package/src/components/ui/resizable/resizable.tsx +46 -8
  87. package/src/lib/cn-tables.generated.ts +10 -10
  88. package/src/styles/base.css +4 -1
  89. package/src/styles/theme.css +23 -43
@@ -1 +1 @@
1
- {"version":3,"file":"input-otp.js","names":["OtpField","ComponentProps","For","Show","splitProps","cn","InputOtpProps","Omit","length","groups","InputOtp","props","local","rest","_$createComponent","_$mergeProps","maxLength","class","children","field","Input","aria-label","each","size","groupIndex","when","_tmpl$","_el$2","_tmpl$2","_$insert","Array","from","_","index","offset","slice","reduce","total","run","slot","_el$3","_tmpl$3","value","_$effect","_p$","_v$","_v$2","activeSlots","includes","_v$3","disabled","e","_$className","t","_$setAttribute","a","undefined","InputOtpCaret","_el$4","_tmpl$4","_$spread","_$createComponent","_$mergeProps","_$className","_$setAttribute"],"sources":["../../../../src/components/ui/input-otp/input-otp.tsx"],"sourcesContent":["import OtpField from '@corvu/otp-field'\nimport type { ComponentProps } from 'solid-js'\nimport { For, Show, splitProps } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * InputOtp.\n *\n * A one-time code, entered into separate boxes. The boxes are the *paint*: the\n * value lives in a single real input, so paste works, autofill works, and a\n * password manager sees one field rather than six.\n *\n * That split is the whole reason to use a component rather than six inputs. Six\n * inputs cannot be pasted into, cannot be autofilled, and announce as six unrelated\n * fields — every one of which is a defect a user hits on the first try.\n *\n * corvu supplies the value handling, the caret movement, the paste split and the\n * keyboard behaviour.\n */\n/**\n * `maxLength` is omitted rather than exposed: corvu requires it, and a caller who\n * has to set both it and `length` will eventually set them to different numbers.\n * `length` is the one input and it drives the other.\n */\nexport type InputOtpProps = Omit<ComponentProps<typeof OtpField>, 'maxLength'> & {\n /** How many characters. */\n length?: number\n /** Group the boxes into runs, e.g. `[3, 3]` for a six-character code. */\n groups?: readonly number[]\n}\n\nexport function InputOtp(props: InputOtpProps) {\n const [local, rest] = splitProps(props, ['class', 'length', 'groups', 'children'])\n\n const length = () => local.length ?? 6\n const groups = () => local.groups ?? [length()]\n\n return (\n <OtpField\n maxLength={length()}\n class={cn('flex items-center gap-2', local.class)}\n {...rest}\n children={(field) => (\n <>\n <OtpField.Input\n aria-label={props['aria-label'] ?? 'One-time code'}\n class=\"absolute inset-0 opacity-0\"\n />\n <For each={groups()}>\n {(size, groupIndex) => (\n <>\n <Show when={groupIndex() > 0}>\n <span aria-hidden=\"true\" class=\"text-muted-foreground px-1\">\n –\n </span>\n </Show>\n <span class=\"flex items-center gap-1.5\">\n <For each={Array.from({ length: size })}>\n {(_, index) => {\n // The slot's index across the whole field, so the boxes after a\n // group boundary continue counting rather than restarting.\n const offset = groups()\n .slice(0, groupIndex())\n .reduce((total, run) => total + run, 0)\n const slot = offset + index()\n return (\n <span\n class={cn(\n 'border-input bg-transparent flex size-10 items-center justify-center rounded-md border text-sm font-medium',\n 'transition-[color,box-shadow,border-color] ease-out',\n 'data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-primary-subtle',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50'\n )}\n data-active={field.activeSlots.includes(slot)}\n data-disabled={props.disabled}\n >\n {field.value[slot] ?? ''}\n </span>\n )\n }}\n </For>\n </span>\n </>\n )}\n </For>\n </>\n )}\n />\n )\n}\n\n/**\n * A caret drawn inside the active box.\n *\n * Exported for a caller building its own slot: the box above renders the character\n * directly, and a blinking caret is the alternative when the field should look\n * empty until something is typed.\n */\nexport function InputOtpCaret(props: ComponentProps<'span'>) {\n const [local, rest] = splitProps(props, ['class'])\n return (\n <span\n aria-hidden=\"true\"\n class={cn('animate-caret bg-foreground inline-block h-4 w-px', local.class)}\n {...rest}\n />\n )\n}\n"],"mappings":";;;;;;;;;AA+BA,SAAgBU,SAASC,OAAsB;CAC7C,MAAM,CAACC,OAAOC,QAAQT,WAAWO,OAAO;EAAC;EAAS;EAAU;EAAU;CAAU,CAAC;CAEjF,MAAMH,eAAeI,MAAMJ,UAAU;CACrC,MAAMC,eAAeG,MAAMH,UAAU,CAACD,OAAO,CAAC;CAE9C,OAAAM,gBACGd,UAAQe,WAAA;EAAA,IACPC,YAAS;GAAA,OAAER,OAAO;EAAC;EAAA,KAAA,WAAA;GAAA,OACZH,GAAG,2BAA2BO,MAAMK,KAAK;EAAC;CAAA,GAC7CJ,MAAI,EACRK,WAAWC,UAAK,CAAAL,gBAEXd,SAASoB,OAAK;EAAA,KAAA,gBAAA;GAAA,OACDT,MAAM,iBAAiB;EAAe;EAAA,SAAA;CAAA,CAAA,GAAAG,gBAGnDZ,KAAG;EAAA,IAACoB,OAAI;GAAA,OAAEb,OAAO;EAAC;EAAAS,WACfK,MAAMC,eAAU,CAAAV,gBAEbX,MAAI;GAAA,IAACsB,OAAI;IAAA,OAAED,WAAW,IAAI;GAAC;GAAA,IAAAN,WAAA;IAAA,OAAAQ,OAAA;GAAA;EAAA,CAAA,UAAA;GAAA,IAAAC,QAAAC,QAAA;GAAAC,OAAAF,OAAAb,gBAMzBZ,KAAG;IAAA,IAACoB,OAAI;KAAA,OAAEQ,MAAMC,KAAK,EAAEvB,QAAQe,KAAK,CAAC;IAAC;IAAAL,WACnCc,GAAGC,UAAU;KAMb,MAAMM,OAHS9B,OAAO,CAAC,CACpB0B,MAAM,GAAGX,WAAW,CAAC,CAAC,CACtBY,QAAQC,OAAOC,QAAQD,QAAQC,KAAK,CAC1BJ,IAASD,MAAM;KAC5B,cAAA;MAAA,IAAAO,QAAAC,QAAA;MAAAZ,OAAAW,aAWKrB,MAAMuB,MAAMH,SAAS,EAAE;MAAAI,QAAAC,QAAA;OAAA,IAAAC,MATjBxC,GACL,8GACA,uDACA,mGACA,+DACF,GAACyC,OACY3B,MAAM4B,YAAYC,SAAST,IAAI,GAACU,OAC9BtC,MAAMuC;OAAQL,QAAAD,IAAAO,KAAAC,UAAAZ,OAAAI,IAAAO,IAAAN,GAAA;OAAAC,SAAAF,IAAAS,KAAAC,aAAAd,OAAA,eAAAI,IAAAS,IAAAP,IAAA;OAAAG,SAAAL,IAAAW,KAAAD,aAAAd,OAAA,iBAAAI,IAAAW,IAAAN,IAAA;OAAA,OAAAL;MAAA,GAAA;OAAAO,GAAAK,KAAAA;OAAAH,GAAAG,KAAAA;OAAAD,GAAAC,KAAAA;MAAA,CAAA;MAAA,OAAAhB;KAAA,EAAA,CAAA;IAKnC;GAAC,CAAA,CAAA;GAAA,OAAAb;EAAA,EAAA,CAAA,CAAA;CAIR,CAAA,CAAA,EAGN,CAAA,CAAA;AAGP;;;;;;;;AASA,SAAgB8B,cAAc9C,OAA+B;CAC3D,MAAM,CAACC,OAAOC,QAAQT,WAAWO,OAAO,CAAC,OAAO,CAAC;CACjD,cAAA;EAAA,IAAA+C,QAAAC,QAAA;EAAAC,OAAAF,OAAA3C,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWV,GAAG,qDAAqDO,MAAMK,KAAK;EAAC,EAAA,GACvEJ,IAAI,GAAA,OAAA,KAAA;EAAA,OAAA6C;CAAA,EAAA,CAAA;AAGd"}
1
+ {"version":3,"file":"input-otp.js","names":["OtpField","ComponentProps","For","Show","splitProps","cn","InputOtpProps","Omit","length","groups","InputOtp","props","local","rest","_$createComponent","_$mergeProps","maxLength","class","children","field","Input","aria-label","each","size","groupIndex","when","_tmpl$","_el$2","_tmpl$2","_$insert","Array","from","_","index","offset","slice","reduce","total","run","slot","_el$3","_tmpl$3","value","_$effect","_p$","_v$","_v$2","activeSlots","includes","_v$3","disabled","undefined","e","_$className","t","_$setAttribute","a","InputOtpCaret","_el$4","_tmpl$4","_$spread","_$createComponent","_$mergeProps","_$className","_$setAttribute"],"sources":["../../../../src/components/ui/input-otp/input-otp.tsx"],"sourcesContent":["import OtpField from '@corvu/otp-field'\nimport type { ComponentProps } from 'solid-js'\nimport { For, Show, splitProps } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * InputOtp.\n *\n * A one-time code, entered into separate boxes. The boxes are the *paint*: the\n * value lives in a single real input, so paste works, autofill works, and a\n * password manager sees one field rather than six.\n *\n * That split is the whole reason to use a component rather than six inputs. Six\n * inputs cannot be pasted into, cannot be autofilled, and announce as six unrelated\n * fields — every one of which is a defect a user hits on the first try.\n *\n * corvu supplies the value handling, the caret movement, the paste split and the\n * keyboard behaviour.\n */\n/**\n * `maxLength` is omitted rather than exposed: corvu requires it, and a caller who\n * has to set both it and `length` will eventually set them to different numbers.\n * `length` is the one input and it drives the other.\n */\nexport type InputOtpProps = Omit<ComponentProps<typeof OtpField>, 'maxLength'> & {\n /** How many characters. */\n length?: number\n /** Group the boxes into runs, e.g. `[3, 3]` for a six-character code. */\n groups?: readonly number[]\n}\n\nexport function InputOtp(props: InputOtpProps) {\n const [local, rest] = splitProps(props, ['class', 'length', 'groups', 'children'])\n\n const length = () => local.length ?? 6\n const groups = () => local.groups ?? [length()]\n\n return (\n <OtpField\n maxLength={length()}\n class={cn(\n 'flex items-center gap-2',\n // corvu positions the field itself, but its hidden input is 40px wider\n // than the field so a password manager's badge lands outside the boxes\n // (`shiftPWManagers`). `clip-path` only hides that overhang; it still\n // counts as overflow, and a full-width field scrolled the page sideways.\n // `overflow-hidden` contains it, and `p-1` keeps the edge boxes' focus\n // ring (`ring-3`) inside the clip.\n 'overflow-hidden p-1',\n local.class\n )}\n {...rest}\n children={(field) => (\n <>\n <OtpField.Input\n aria-label={props['aria-label'] ?? 'One-time code'}\n class=\"absolute inset-0 opacity-0\"\n />\n <For each={groups()}>\n {(size, groupIndex) => (\n <>\n <Show when={groupIndex() > 0}>\n <span aria-hidden=\"true\" class=\"text-muted-foreground px-1\">\n –\n </span>\n </Show>\n <span class=\"flex items-center gap-1.5\">\n <For each={Array.from({ length: size })}>\n {(_, index) => {\n // The slot's index across the whole field, so the boxes after a\n // group boundary continue counting rather than restarting.\n const offset = groups()\n .slice(0, groupIndex())\n .reduce((total, run) => total + run, 0)\n const slot = offset + index()\n return (\n <span\n class={cn(\n 'border-input bg-transparent flex size-10 items-center justify-center rounded-md border text-sm font-medium',\n 'transition-[color,box-shadow,border-color] ease-out',\n 'data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-primary-subtle',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50'\n )}\n data-active={field.activeSlots.includes(slot)}\n // Present-or-absent, never `\"false\"`: `data-[disabled]`\n // matches any value, so `disabled={false}` dimmed the boxes.\n data-disabled={props.disabled ? '' : undefined}\n >\n {field.value[slot] ?? ''}\n </span>\n )\n }}\n </For>\n </span>\n </>\n )}\n </For>\n </>\n )}\n />\n )\n}\n\n/**\n * A caret drawn inside the active box.\n *\n * Exported for a caller building its own slot: the box above renders the character\n * directly, and a blinking caret is the alternative when the field should look\n * empty until something is typed.\n */\nexport function InputOtpCaret(props: ComponentProps<'span'>) {\n const [local, rest] = splitProps(props, ['class'])\n return (\n <span\n aria-hidden=\"true\"\n class={cn('animate-caret bg-foreground inline-block h-4 w-px', local.class)}\n {...rest}\n />\n )\n}\n"],"mappings":";;;;;;;;;AA+BA,SAAgBU,SAASC,OAAsB;CAC7C,MAAM,CAACC,OAAOC,QAAQT,WAAWO,OAAO;EAAC;EAAS;EAAU;EAAU;CAAU,CAAC;CAEjF,MAAMH,eAAeI,MAAMJ,UAAU;CACrC,MAAMC,eAAeG,MAAMH,UAAU,CAACD,OAAO,CAAC;CAE9C,OAAAM,gBACGd,UAAQe,WAAA;EAAA,IACPC,YAAS;GAAA,OAAER,OAAO;EAAC;EAAA,KAAA,WAAA;GAAA,OACZH,GACL,2BAOA,uBACAO,MAAMK,KACR;EAAC;CAAA,GACGJ,MAAI,EACRK,WAAWC,UAAK,CAAAL,gBAEXd,SAASoB,OAAK;EAAA,KAAA,gBAAA;GAAA,OACDT,MAAM,iBAAiB;EAAe;EAAA,SAAA;CAAA,CAAA,GAAAG,gBAGnDZ,KAAG;EAAA,IAACoB,OAAI;GAAA,OAAEb,OAAO;EAAC;EAAAS,WACfK,MAAMC,eAAU,CAAAV,gBAEbX,MAAI;GAAA,IAACsB,OAAI;IAAA,OAAED,WAAW,IAAI;GAAC;GAAA,IAAAN,WAAA;IAAA,OAAAQ,OAAA;GAAA;EAAA,CAAA,UAAA;GAAA,IAAAC,QAAAC,QAAA;GAAAC,OAAAF,OAAAb,gBAMzBZ,KAAG;IAAA,IAACoB,OAAI;KAAA,OAAEQ,MAAMC,KAAK,EAAEvB,QAAQe,KAAK,CAAC;IAAC;IAAAL,WACnCc,GAAGC,UAAU;KAMb,MAAMM,OAHS9B,OAAO,CAAC,CACpB0B,MAAM,GAAGX,WAAW,CAAC,CAAC,CACtBY,QAAQC,OAAOC,QAAQD,QAAQC,KAAK,CAC1BJ,IAASD,MAAM;KAC5B,cAAA;MAAA,IAAAO,QAAAC,QAAA;MAAAZ,OAAAW,aAaKrB,MAAMuB,MAAMH,SAAS,EAAE;MAAAI,QAAAC,QAAA;OAAA,IAAAC,MAXjBxC,GACL,8GACA,uDACA,mGACA,+DACF,GAACyC,OACY3B,MAAM4B,YAAYC,SAAST,IAAI,GAACU,OAG9BtC,MAAMuC,WAAW,KAAKC,KAAAA;OAASN,QAAAD,IAAAQ,KAAAC,UAAAb,OAAAI,IAAAQ,IAAAP,GAAA;OAAAC,SAAAF,IAAAU,KAAAC,aAAAf,OAAA,eAAAI,IAAAU,IAAAR,IAAA;OAAAG,SAAAL,IAAAY,KAAAD,aAAAf,OAAA,iBAAAI,IAAAY,IAAAP,IAAA;OAAA,OAAAL;MAAA,GAAA;OAAAQ,GAAAD,KAAAA;OAAAG,GAAAH,KAAAA;OAAAK,GAAAL,KAAAA;MAAA,CAAA;MAAA,OAAAX;KAAA,EAAA,CAAA;IAKpD;GAAC,CAAA,CAAA;GAAA,OAAAb;EAAA,EAAA,CAAA,CAAA;CAIR,CAAA,CAAA,EAGN,CAAA,CAAA;AAGP;;;;;;;;AASA,SAAgB8B,cAAc9C,OAA+B;CAC3D,MAAM,CAACC,OAAOC,QAAQT,WAAWO,OAAO,CAAC,OAAO,CAAC;CACjD,cAAA;EAAA,IAAA+C,QAAAC,QAAA;EAAAC,OAAAF,OAAA3C,WAAA,EAAA,KAAA,WAAA;GAAA,OAGWV,GAAG,qDAAqDO,MAAMK,KAAK;EAAC,EAAA,GACvEJ,IAAI,GAAA,OAAA,KAAA;EAAA,OAAA6C;CAAA,EAAA,CAAA;AAGd"}
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/pagination/pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,IAAI,iBAAiB,EAC/B,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAInD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,eAAe,GAAG,mBAAmB,CAAC,GAAG;IACjG,aAAa,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAA;IACtD,iBAAiB,CAAC,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAA;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAWD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,eAuBhD;AAaD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,eAa1F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,eAalF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,eAelF;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,eAiBtF"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/pagination/pagination.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,IAAI,iBAAiB,EAC/B,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAInD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,eAAe,GAAG,mBAAmB,CAAC,GAAG;IACjG,aAAa,CAAC,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAA;IACtD,iBAAiB,CAAC,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAA;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAWD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,eA8BhD;AAaD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,eAa1F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,eAalF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,IAAI,CAAC,eAelF;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,CAAC,OAAO,iBAAiB,CAAC,QAAQ,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,eAiBtF"}
@@ -30,7 +30,7 @@ function Pagination$1(props) {
30
30
  return local.ellipsisComponent ?? (() => createComponent(PaginationEllipsis, {}));
31
31
  },
32
32
  get ["class"]() {
33
- return cn("flex w-full items-center justify-center gap-1", local.class);
33
+ return cn("flex w-full items-center justify-center [&>ul]:m-0 [&>ul]:flex [&>ul]:list-none [&>ul]:items-center [&>ul]:gap-1 [&>ul]:p-0", local.class);
34
34
  }
35
35
  }, rest, { get children() {
36
36
  return createComponent(Show, {
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","names":["Pagination","KobaltePagination","PaginationRootOptions","ChevronLeft","ChevronRight","MoreHorizontal","ComponentProps","JSX","Show","splitProps","cn","PaginationProps","Omit","itemComponent","ellipsisComponent","class","children","Element","paginationControl","props","local","rest","_$createComponent","_$mergeProps","itemProps","PaginationItem","page","PaginationEllipsis","when","fallback","DefaultPaginationControls","PaginationPrevious","Items","PaginationNext","Previous","_tmpl$","Next","_tmpl$2","Item","Ellipsis","_tmpl$3","Pagination","_$createComponent","KobaltePagination","_$mergeProps"],"sources":["../../../../src/components/ui/pagination/pagination.tsx"],"sourcesContent":["import {\n Pagination as KobaltePagination,\n type PaginationRootOptions,\n} from '@kobalte/core/pagination'\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-solid'\nimport type { ComponentProps, JSX } from 'solid-js'\nimport { Show, splitProps } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * Pagination.\n *\n * Page navigation for a list the server pages, not for a list the client already\n * holds — slicing an array you have is a filter, and it should not spend a round\n * trip.\n *\n * Kobalte computes the visible page window and the ellipsis positions and emits\n * `aria-current=\"page\"`, so the control announces which page is active instead of\n * leaving it to colour alone.\n *\n * The item and ellipsis renderers are *supplied here*, not required of the caller.\n * Kobalte's root makes them mandatory because it has no opinion about how a page\n * number should look; a design system does, so the only thing a caller has to pass\n * is `count` — while still being able to override either renderer when a view\n * needs to.\n */\nexport type PaginationProps = Omit<PaginationRootOptions, 'itemComponent' | 'ellipsisComponent'> & {\n itemComponent?: PaginationRootOptions['itemComponent']\n ellipsisComponent?: PaginationRootOptions['ellipsisComponent']\n class?: string\n children?: JSX.Element\n}\n\nconst paginationControl = cn(\n 'inline-flex h-control-md min-w-(--control-height-md) items-center justify-center gap-1 rounded-md border border-transparent px-2 text-sm tabular-nums',\n 'transition-colors ease-out outline-none select-none',\n 'hover:bg-surface-hover',\n 'focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-primary-subtle',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:size-4'\n)\n\nexport function Pagination(props: PaginationProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'itemComponent',\n 'ellipsisComponent',\n 'children',\n ])\n\n return (\n <KobaltePagination\n itemComponent={\n local.itemComponent ??\n ((itemProps) => <PaginationItem page={itemProps.page}>{itemProps.page}</PaginationItem>)\n }\n ellipsisComponent={local.ellipsisComponent ?? (() => <PaginationEllipsis />)}\n class={cn('flex w-full items-center justify-center gap-1', local.class)}\n {...rest}\n >\n <Show when={local.children} fallback={<DefaultPaginationControls />}>\n {local.children}\n </Show>\n </KobaltePagination>\n )\n}\n\n/** Previous, the numbered run, next: the arrangement every list view wants. */\nfunction DefaultPaginationControls() {\n return (\n <>\n <PaginationPrevious />\n <KobaltePagination.Items />\n <PaginationNext />\n </>\n )\n}\n\nexport function PaginationPrevious(props: ComponentProps<typeof KobaltePagination.Previous>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Previous class={cn(paginationControl, 'ps-1.5', local.class)} {...rest}>\n {local.children ?? (\n <>\n <ChevronLeft class=\"size-4\" />\n <span class=\"hidden sm:inline\">Previous</span>\n </>\n )}\n </KobaltePagination.Previous>\n )\n}\n\nexport function PaginationNext(props: ComponentProps<typeof KobaltePagination.Next>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Next class={cn(paginationControl, 'pe-1.5', local.class)} {...rest}>\n {local.children ?? (\n <>\n <span class=\"hidden sm:inline\">Next</span>\n <ChevronRight class=\"size-4\" />\n </>\n )}\n </KobaltePagination.Next>\n )\n}\n\nexport function PaginationItem(props: ComponentProps<typeof KobaltePagination.Item>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Item\n class={cn(\n paginationControl,\n 'data-[current]:border-border data-[current]:bg-surface-active data-[current]:font-medium',\n local.class\n )}\n {...rest}\n >\n {local.children}\n </KobaltePagination.Item>\n )\n}\n\nexport function PaginationEllipsis(\n props: ComponentProps<typeof KobaltePagination.Ellipsis> & { children?: JSX.Element }\n) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Ellipsis\n class={cn('flex size-control-md items-center justify-center', local.class)}\n {...rest}\n >\n {local.children ?? (\n <>\n <MoreHorizontal class=\"size-4\" />\n <span class=\"visually-hidden\">More pages</span>\n </>\n )}\n </KobaltePagination.Ellipsis>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pagination.js","names":["Pagination","KobaltePagination","PaginationRootOptions","ChevronLeft","ChevronRight","MoreHorizontal","ComponentProps","JSX","Show","splitProps","cn","PaginationProps","Omit","itemComponent","ellipsisComponent","class","children","Element","paginationControl","props","local","rest","_$createComponent","_$mergeProps","itemProps","PaginationItem","page","PaginationEllipsis","when","fallback","DefaultPaginationControls","PaginationPrevious","Items","PaginationNext","Previous","_tmpl$","Next","_tmpl$2","Item","Ellipsis","_tmpl$3","Pagination","_$createComponent","KobaltePagination","_$mergeProps"],"sources":["../../../../src/components/ui/pagination/pagination.tsx"],"sourcesContent":["import {\n Pagination as KobaltePagination,\n type PaginationRootOptions,\n} from '@kobalte/core/pagination'\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-solid'\nimport type { ComponentProps, JSX } from 'solid-js'\nimport { Show, splitProps } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * Pagination.\n *\n * Page navigation for a list the server pages, not for a list the client already\n * holds — slicing an array you have is a filter, and it should not spend a round\n * trip.\n *\n * Kobalte computes the visible page window and the ellipsis positions and emits\n * `aria-current=\"page\"`, so the control announces which page is active instead of\n * leaving it to colour alone.\n *\n * The item and ellipsis renderers are *supplied here*, not required of the caller.\n * Kobalte's root makes them mandatory because it has no opinion about how a page\n * number should look; a design system does, so the only thing a caller has to pass\n * is `count` — while still being able to override either renderer when a view\n * needs to.\n */\nexport type PaginationProps = Omit<PaginationRootOptions, 'itemComponent' | 'ellipsisComponent'> & {\n itemComponent?: PaginationRootOptions['itemComponent']\n ellipsisComponent?: PaginationRootOptions['ellipsisComponent']\n class?: string\n children?: JSX.Element\n}\n\nconst paginationControl = cn(\n 'inline-flex h-control-md min-w-(--control-height-md) items-center justify-center gap-1 rounded-md border border-transparent px-2 text-sm tabular-nums',\n 'transition-colors ease-out outline-none select-none',\n 'hover:bg-surface-hover',\n 'focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-primary-subtle',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:size-4'\n)\n\nexport function Pagination(props: PaginationProps) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'itemComponent',\n 'ellipsisComponent',\n 'children',\n ])\n\n return (\n <KobaltePagination\n itemComponent={\n local.itemComponent ??\n ((itemProps) => <PaginationItem page={itemProps.page}>{itemProps.page}</PaginationItem>)\n }\n ellipsisComponent={local.ellipsisComponent ?? (() => <PaginationEllipsis />)}\n // Kobalte renders the root as a `<nav>` wrapping a `<ul>`, and every control —\n // previous, the page run, next — is an `<li>` inside that list. The row has to be\n // declared on the list: on the `<nav>` alone it lays out one child and the\n // controls stack vertically.\n class={cn(\n 'flex w-full items-center justify-center [&>ul]:m-0 [&>ul]:flex [&>ul]:list-none [&>ul]:items-center [&>ul]:gap-1 [&>ul]:p-0',\n local.class\n )}\n {...rest}\n >\n <Show when={local.children} fallback={<DefaultPaginationControls />}>\n {local.children}\n </Show>\n </KobaltePagination>\n )\n}\n\n/** Previous, the numbered run, next: the arrangement every list view wants. */\nfunction DefaultPaginationControls() {\n return (\n <>\n <PaginationPrevious />\n <KobaltePagination.Items />\n <PaginationNext />\n </>\n )\n}\n\nexport function PaginationPrevious(props: ComponentProps<typeof KobaltePagination.Previous>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Previous class={cn(paginationControl, 'ps-1.5', local.class)} {...rest}>\n {local.children ?? (\n <>\n <ChevronLeft class=\"size-4\" />\n <span class=\"hidden sm:inline\">Previous</span>\n </>\n )}\n </KobaltePagination.Previous>\n )\n}\n\nexport function PaginationNext(props: ComponentProps<typeof KobaltePagination.Next>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Next class={cn(paginationControl, 'pe-1.5', local.class)} {...rest}>\n {local.children ?? (\n <>\n <span class=\"hidden sm:inline\">Next</span>\n <ChevronRight class=\"size-4\" />\n </>\n )}\n </KobaltePagination.Next>\n )\n}\n\nexport function PaginationItem(props: ComponentProps<typeof KobaltePagination.Item>) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Item\n class={cn(\n paginationControl,\n 'data-[current]:border-border data-[current]:bg-surface-active data-[current]:font-medium',\n local.class\n )}\n {...rest}\n >\n {local.children}\n </KobaltePagination.Item>\n )\n}\n\nexport function PaginationEllipsis(\n props: ComponentProps<typeof KobaltePagination.Ellipsis> & { children?: JSX.Element }\n) {\n const [local, rest] = splitProps(props, ['class', 'children'])\n\n return (\n <KobaltePagination.Ellipsis\n class={cn('flex size-control-md items-center justify-center', local.class)}\n {...rest}\n >\n {local.children ?? (\n <>\n <MoreHorizontal class=\"size-4\" />\n <span class=\"visually-hidden\">More pages</span>\n </>\n )}\n </KobaltePagination.Ellipsis>\n )\n}\n"],"mappings":";;;;;;;;;AAiCA,IAAMkB,oBAAoBR,GACxB,yJACA,uDACA,0BACA,oFACA,oDACA,4CACF;AAEA,SAAgBV,aAAWmB,OAAwB;CACjD,MAAM,CAACC,OAAOC,QAAQZ,WAAWU,OAAO;EACtC;EACA;EACA;EACA;CAAU,CACX;CAED,OAAAG,gBACGrB,YAAiBsB,WAAA;EAAA,IAChBV,gBAAa;GAAA,OACXO,MAAMP,mBACJW,cAASF,gBAAMG,gBAAc;IAAA,IAACC,OAAI;KAAA,OAAEF,UAAUE;IAAI;IAAA,IAAAV,WAAA;KAAA,OAAGQ,UAAUE;IAAI;GAAA,CAAA;EAAmB;EAAA,IAE1FZ,oBAAiB;GAAA,OAAEM,MAAMN,4BAAsBQ,gBAAOK,oBAAkB,CAAA,CAAA;EAAI;EAAA,KAAA,WAAA;GAAA,OAKrEjB,GACL,+HACAU,MAAML,KACR;EAAC;CAAA,GACGM,MAAI,EAAA,IAAAL,WAAA;EAAA,OAAAM,gBAEPd,MAAI;GAAA,IAACoB,OAAI;IAAA,OAAER,MAAMJ;GAAQ;GAAA,IAAEa,WAAQ;IAAA,OAAAP,gBAAGQ,2BAAyB,CAAA,CAAA;GAAA;GAAA,IAAAd,WAAA;IAAA,OAC7DI,MAAMJ;GAAQ;EAAA,CAAA;CAAA,EAAA,CAAA,CAAA;AAIvB;;AAGA,SAASc,4BAA4B;CACnC,OAAA;EAAAR,gBAEKS,oBAAkB,CAAA,CAAA;EAAAT,gBAClBrB,WAAkB+B,OAAK,CAAA,CAAA;EAAAV,gBACvBW,gBAAc,CAAA,CAAA;CAAA;AAGrB;AAEA,SAAgBF,mBAAmBZ,OAA0D;CAC3F,MAAM,CAACC,OAAOC,QAAQZ,WAAWU,OAAO,CAAC,SAAS,UAAU,CAAC;CAE7D,OAAAG,gBACGrB,WAAkBiC,UAAQX,WAAA,EAAA,KAAA,WAAA;EAAA,OAAQb,GAAGQ,mBAAmB,UAAUE,MAAML,KAAK;CAAC,EAAA,GAAMM,MAAI,EAAA,IAAAL,WAAA;EAAA,OACtFI,MAAMJ,YAAQ,CAAAM,gBAEVnB,aAAW,EAAA,SAAA,SAAA,CAAA,GAAAgC,OAAA,CAAA;CAGf,EAAA,CAAA,CAAA;AAGP;AAEA,SAAgBF,eAAed,OAAsD;CACnF,MAAM,CAACC,OAAOC,QAAQZ,WAAWU,OAAO,CAAC,SAAS,UAAU,CAAC;CAE7D,OAAAG,gBACGrB,WAAkBmC,MAAIb,WAAA,EAAA,KAAA,WAAA;EAAA,OAAQb,GAAGQ,mBAAmB,UAAUE,MAAML,KAAK;CAAC,EAAA,GAAMM,MAAI,EAAA,IAAAL,WAAA;EAAA,OAClFI,MAAMJ,YAAQ,CAAAqB,QAAA,GAAAf,gBAGVlB,cAAY,EAAA,SAAA,SAAA,CAAA,CAAA;CAEhB,EAAA,CAAA,CAAA;AAGP;AAEA,SAAgBqB,eAAeN,OAAsD;CACnF,MAAM,CAACC,OAAOC,QAAQZ,WAAWU,OAAO,CAAC,SAAS,UAAU,CAAC;CAE7D,OAAAG,gBACGrB,WAAkBqC,MAAIf,WAAA,EAAA,KAAA,WAAA;EAAA,OACdb,GACLQ,mBACA,4FACAE,MAAML,KACR;CAAC,EAAA,GACGM,MAAI,EAAA,IAAAL,WAAA;EAAA,OAEPI,MAAMJ;CAAQ,EAAA,CAAA,CAAA;AAGrB;AAEA,SAAgBW,mBACdR,OACA;CACA,MAAM,CAACC,OAAOC,QAAQZ,WAAWU,OAAO,CAAC,SAAS,UAAU,CAAC;CAE7D,OAAAG,gBACGrB,WAAkBsC,UAAQhB,WAAA,EAAA,KAAA,WAAA;EAAA,OAClBb,GAAG,oDAAoDU,MAAML,KAAK;CAAC,EAAA,GACtEM,MAAI,EAAA,IAAAL,WAAA;EAAA,OAEPI,MAAMJ,YAAQ,CAAAM,gBAEVjB,gBAAc,EAAA,SAAA,SAAA,CAAA,GAAAmC,QAAA,CAAA;CAGlB,EAAA,CAAA,CAAA;AAGP"}
@@ -1,17 +1,5 @@
1
1
  import Resizable from '@corvu/resizable';
2
2
  import type { ComponentProps } from 'solid-js';
3
- /**
4
- * Resizable.
5
- *
6
- * A split layout: panels the user can resize, with a handle between them. This
7
- * is the shape of every IDE-like surface — rail, file tree, editor, terminal —
8
- * and the reason it is a primitive rather than something each view improvises.
9
- *
10
- * corvu supplies the pointer capture, the min/max constraints and the keyboard
11
- * resizing, which is what makes a divider operable without a mouse. The handle
12
- * is a real focusable element with an accessible role, so a split pane can be
13
- * adjusted from the keyboard; a bare `cursor-col-resize` div cannot.
14
- */
15
3
  export declare function ResizablePanelGroup(props: ComponentProps<typeof Resizable> & {
16
4
  class?: string;
17
5
  }): import("solid-js").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"resizable.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/resizable/resizable.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAI9C;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,kCAS/F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,kCAGhG;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,kCA2B1D"}
1
+ {"version":3,"file":"resizable.d.ts","sourceRoot":"","sources":["../../../../src/components/ui/resizable/resizable.tsx"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAA;AAExC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAuB9C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,kCAW/F;AAgBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,kCAchG;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,GAAG;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,kCA+B1D"}
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { createComponent, insert, memo, mergeProps, template } from "solid-js/web";
3
3
  import { GripVertical } from "lucide-solid";
4
- import { splitProps } from "solid-js";
4
+ import { createContext, splitProps, useContext } from "solid-js";
5
5
  import Resizable from "@corvu/resizable";
6
6
  //#region src/components/ui/resizable/resizable.tsx
7
7
  var _tmpl$ = /*#__PURE__*/ template(`<div class="bg-border z-(--z-docked) flex h-4 w-2.5 items-center justify-center rounded-sm border border-border">`);
@@ -17,17 +17,48 @@ var _tmpl$ = /*#__PURE__*/ template(`<div class="bg-border z-(--z-docked) flex h
17
17
  * is a real focusable element with an accessible role, so a split pane can be
18
18
  * adjusted from the keyboard; a bare `cursor-col-resize` div cannot.
19
19
  */
20
+ /**
21
+ * Whether the group was given `initialSizes`. Those are corvu's to apply, and a
22
+ * panel's own `initialSize` overrides them — so an unsized panel must not invent
23
+ * one when the group already has an answer.
24
+ */
25
+ var GroupSizesContext = createContext(() => false);
20
26
  function ResizablePanelGroup(props) {
21
27
  const [local, rest] = splitProps(props, ["class"]);
22
- return createComponent(Resizable, mergeProps({ get ["class"]() {
23
- return cn("flex size-full data-[orientation=vertical]:flex-col", local.class);
24
- } }, rest));
28
+ return createComponent(GroupSizesContext.Provider, {
29
+ value: () => rest.initialSizes !== void 0,
30
+ get children() {
31
+ return createComponent(Resizable, mergeProps({ get ["class"]() {
32
+ return cn("flex size-full data-[orientation=vertical]:flex-col", local.class);
33
+ } }, rest));
34
+ }
35
+ });
36
+ }
37
+ /**
38
+ * The size an unsized panel registers with: whatever its earlier siblings left.
39
+ *
40
+ * corvu registers a panel without `initialSize` at a flat 50%, so `0.28` beside
41
+ * an unsized panel summed to 78% and left a gap. Panels register in document
42
+ * order, so at registration `sizes` holds exactly the panels before this one.
43
+ * When nothing is left — a second unsized panel — it takes an equal share, and
44
+ * corvu shrinks the earlier panels by that share to keep the total at 100%.
45
+ */
46
+ function remainingSize(sizes) {
47
+ const left = 1 - sizes.reduce((total, size) => total + size, 0);
48
+ return left > .001 ? left : 1 / (sizes.length + 1);
25
49
  }
26
50
  function ResizablePanel(props) {
27
- const [local, rest] = splitProps(props, ["class"]);
28
- return createComponent(Resizable.Panel, mergeProps({ get ["class"]() {
29
- return cn("min-h-0 min-w-0 overflow-hidden", local.class);
30
- } }, rest));
51
+ const [local, rest] = splitProps(props, ["class", "initialSize"]);
52
+ const group = Resizable.useContext(rest.contextId);
53
+ const groupHasSizes = useContext(GroupSizesContext);
54
+ return createComponent(Resizable.Panel, mergeProps({
55
+ get initialSize() {
56
+ return local.initialSize ?? (groupHasSizes() ? void 0 : remainingSize(group.sizes()));
57
+ },
58
+ get ["class"]() {
59
+ return cn("min-h-0 min-w-0 overflow-hidden", local.class);
60
+ }
61
+ }, rest));
31
62
  }
32
63
  function ResizableHandle(props) {
33
64
  const [local, rest] = splitProps(props, [
@@ -35,11 +66,14 @@ function ResizableHandle(props) {
35
66
  "withHandle",
36
67
  "label"
37
68
  ]);
69
+ const group = Resizable.useContext(rest.contextId);
38
70
  return createComponent(Resizable.Handle, mergeProps({
39
71
  get ["aria-label"]() {
40
72
  return local.label ?? "Resize panels";
41
73
  },
42
- "aria-orientation": "vertical",
74
+ get ["aria-orientation"]() {
75
+ return group.orientation() === "horizontal" ? "vertical" : "horizontal";
76
+ },
43
77
  get ["class"]() {
44
78
  return cn("group/resize bg-border relative flex w-px shrink-0 items-center justify-center", "after:absolute after:inset-y-0 after:-inset-x-1 after:w-3", "transition-colors ease-out hover:bg-primary", "focus-visible:bg-primary focus-visible:outline-none", "data-[orientation=vertical]:h-px data-[orientation=vertical]:w-full", "data-[orientation=vertical]:after:inset-x-0 data-[orientation=vertical]:after:-inset-y-1 data-[orientation=vertical]:after:h-3 data-[orientation=vertical]:after:w-full", local.class);
45
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resizable.js","names":["Resizable","GripVertical","ComponentProps","splitProps","cn","ResizablePanelGroup","props","class","local","rest","_$createComponent","_$mergeProps","ResizablePanel","Panel","ResizableHandleProps","Handle","withHandle","label","ResizableHandle","aria-label","children","_$memo","_el$","_tmpl$","_$insert","_$createComponent","_$mergeProps","_$memo"],"sources":["../../../../src/components/ui/resizable/resizable.tsx"],"sourcesContent":["import Resizable from '@corvu/resizable'\nimport { GripVertical } from 'lucide-solid'\nimport type { ComponentProps } from 'solid-js'\nimport { splitProps } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * Resizable.\n *\n * A split layout: panels the user can resize, with a handle between them. This\n * is the shape of every IDE-like surface — rail, file tree, editor, terminal —\n * and the reason it is a primitive rather than something each view improvises.\n *\n * corvu supplies the pointer capture, the min/max constraints and the keyboard\n * resizing, which is what makes a divider operable without a mouse. The handle\n * is a real focusable element with an accessible role, so a split pane can be\n * adjusted from the keyboard; a bare `cursor-col-resize` div cannot.\n */\nexport function ResizablePanelGroup(props: ComponentProps<typeof Resizable> & { class?: string }) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <Resizable\n class={cn('flex size-full data-[orientation=vertical]:flex-col', local.class)}\n {...rest}\n />\n )\n}\n\nexport function ResizablePanel(props: ComponentProps<typeof Resizable.Panel> & { class?: string }) {\n const [local, rest] = splitProps(props, ['class'])\n return <Resizable.Panel class={cn('min-h-0 min-w-0 overflow-hidden', local.class)} {...rest} />\n}\n\nexport type ResizableHandleProps = ComponentProps<typeof Resizable.Handle> & {\n class?: string\n /** Draw a visible grip in the middle of the divider. */\n withHandle?: boolean\n /**\n * The divider's accessible name. It is a focusable control — arrow keys move\n * the split — so it needs one; without it a screen reader announces an\n * unlabelled button between the two panels.\n */\n label?: string\n}\n\nexport function ResizableHandle(props: ResizableHandleProps) {\n const [local, rest] = splitProps(props, ['class', 'withHandle', 'label'])\n\n return (\n <Resizable.Handle\n aria-label={local.label ?? 'Resize panels'}\n aria-orientation=\"vertical\"\n class={cn(\n 'group/resize bg-border relative flex w-px shrink-0 items-center justify-center',\n /* Widen the hit target without moving the visual line: the divider is\n a hairline, but a hairline is far too small to grab. */\n 'after:absolute after:inset-y-0 after:-inset-x-1 after:w-3',\n 'transition-colors ease-out hover:bg-primary',\n 'focus-visible:bg-primary focus-visible:outline-none',\n 'data-[orientation=vertical]:h-px data-[orientation=vertical]:w-full',\n 'data-[orientation=vertical]:after:inset-x-0 data-[orientation=vertical]:after:-inset-y-1 data-[orientation=vertical]:after:h-3 data-[orientation=vertical]:after:w-full',\n local.class\n )}\n {...rest}\n >\n {local.withHandle ? (\n <div class=\"bg-border z-(--z-docked) flex h-4 w-2.5 items-center justify-center rounded-sm border border-border\">\n <GripVertical class=\"size-2.5 text-muted-foreground\" />\n </div>\n ) : null}\n </Resizable.Handle>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,SAAgBK,oBAAoBC,OAA8D;CAChG,MAAM,CAACE,OAAOC,QAAQN,WAAWG,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAI,gBACGV,WAASW,WAAA,EAAA,KAAA,WAAA;EAAA,OACDP,GAAG,uDAAuDI,MAAMD,KAAK;CAAC,EAAA,GACzEE,IAAI,CAAA;AAGd;AAEA,SAAgBG,eAAeN,OAAoE;CACjG,MAAM,CAACE,OAAOC,QAAQN,WAAWG,OAAO,CAAC,OAAO,CAAC;CACjD,OAAAI,gBAAQV,UAAUa,OAAKF,WAAA,EAAA,KAAA,WAAA;EAAA,OAAQP,GAAG,mCAAmCI,MAAMD,KAAK;CAAC,EAAA,GAAME,IAAI,CAAA;AAC7F;AAcA,SAAgBS,gBAAgBZ,OAA6B;CAC3D,MAAM,CAACE,OAAOC,QAAQN,WAAWG,OAAO;EAAC;EAAS;EAAc;CAAO,CAAC;CAExE,OAAAI,gBACGV,UAAUe,QAAMJ,WAAA;EAAA,KAAA,gBAAA;GAAA,OACHH,MAAMS,SAAS;EAAe;EAAA,oBAAA;EAAA,KAAA,WAAA;GAAA,OAEnCb,GACL,kFAGA,6DACA,+CACA,uDACA,uEACA,2KACAI,MAAMD,KACR;EAAC;CAAA,GACGE,MAAI,EAAA,IAAAW,WAAA;EAAA,OAEPC,WAAA,CAAA,CAAAb,MAAMQ,UAAU,CAAA,CAAA,WAAA;GAAA,IAAAM,OAAAC,OAAA;GAAAC,OAAAF,MAAAZ,gBAEZT,cAAY,EAAA,SAAA,iCAAA,CAAA,CAAA;GAAA,OAAAqB;EAAA,EAAA,CAAA,IAEb;CAAI,EAAA,CAAA,CAAA;AAGd"}
1
+ {"version":3,"file":"resizable.js","names":["Resizable","GripVertical","ComponentProps","createContext","splitProps","useContext","cn","GroupSizesContext","ResizablePanelGroup","props","class","local","rest","_$createComponent","Provider","value","initialSizes","undefined","children","_$mergeProps","remainingSize","sizes","left","reduce","total","size","length","ResizablePanel","Panel","group","contextId","groupHasSizes","initialSize","ResizableHandleProps","Handle","withHandle","label","ResizableHandle","aria-label","aria-orientation","orientation","_$memo","_el$","_tmpl$","_$insert","_$createComponent","_$mergeProps","_$memo"],"sources":["../../../../src/components/ui/resizable/resizable.tsx"],"sourcesContent":["import Resizable from '@corvu/resizable'\nimport { GripVertical } from 'lucide-solid'\nimport type { ComponentProps } from 'solid-js'\nimport { createContext, splitProps, useContext } from 'solid-js'\nimport { cn } from '#lib/utils'\n\n/**\n * Resizable.\n *\n * A split layout: panels the user can resize, with a handle between them. This\n * is the shape of every IDE-like surface — rail, file tree, editor, terminal —\n * and the reason it is a primitive rather than something each view improvises.\n *\n * corvu supplies the pointer capture, the min/max constraints and the keyboard\n * resizing, which is what makes a divider operable without a mouse. The handle\n * is a real focusable element with an accessible role, so a split pane can be\n * adjusted from the keyboard; a bare `cursor-col-resize` div cannot.\n */\n/**\n * Whether the group was given `initialSizes`. Those are corvu's to apply, and a\n * panel's own `initialSize` overrides them — so an unsized panel must not invent\n * one when the group already has an answer.\n */\nconst GroupSizesContext = createContext<() => boolean>(() => false)\n\nexport function ResizablePanelGroup(props: ComponentProps<typeof Resizable> & { class?: string }) {\n const [local, rest] = splitProps(props, ['class'])\n\n return (\n <GroupSizesContext.Provider value={() => rest.initialSizes !== undefined}>\n <Resizable\n class={cn('flex size-full data-[orientation=vertical]:flex-col', local.class)}\n {...rest}\n />\n </GroupSizesContext.Provider>\n )\n}\n\n/**\n * The size an unsized panel registers with: whatever its earlier siblings left.\n *\n * corvu registers a panel without `initialSize` at a flat 50%, so `0.28` beside\n * an unsized panel summed to 78% and left a gap. Panels register in document\n * order, so at registration `sizes` holds exactly the panels before this one.\n * When nothing is left — a second unsized panel — it takes an equal share, and\n * corvu shrinks the earlier panels by that share to keep the total at 100%.\n */\nfunction remainingSize(sizes: readonly number[]): number {\n const left = 1 - sizes.reduce((total, size) => total + size, 0)\n return left > 0.001 ? left : 1 / (sizes.length + 1)\n}\n\nexport function ResizablePanel(props: ComponentProps<typeof Resizable.Panel> & { class?: string }) {\n const [local, rest] = splitProps(props, ['class', 'initialSize'])\n const group = Resizable.useContext(rest.contextId)\n const groupHasSizes = useContext(GroupSizesContext)\n\n return (\n <Resizable.Panel\n initialSize={\n local.initialSize ?? (groupHasSizes() ? undefined : remainingSize(group.sizes()))\n }\n class={cn('min-h-0 min-w-0 overflow-hidden', local.class)}\n {...rest}\n />\n )\n}\n\nexport type ResizableHandleProps = ComponentProps<typeof Resizable.Handle> & {\n class?: string\n /** Draw a visible grip in the middle of the divider. */\n withHandle?: boolean\n /**\n * The divider's accessible name. It is a focusable control — arrow keys move\n * the split — so it needs one; without it a screen reader announces an\n * unlabelled button between the two panels.\n */\n label?: string\n}\n\nexport function ResizableHandle(props: ResizableHandleProps) {\n const [local, rest] = splitProps(props, ['class', 'withHandle', 'label'])\n const group = Resizable.useContext(rest.contextId)\n\n return (\n <Resizable.Handle\n aria-label={local.label ?? 'Resize panels'}\n // A separator's orientation is the line's own, which runs across the\n // group: a row of panels is divided by a vertical line, a column by a\n // horizontal one. corvu reports the group's orientation instead.\n aria-orientation={group.orientation() === 'horizontal' ? 'vertical' : 'horizontal'}\n class={cn(\n 'group/resize bg-border relative flex w-px shrink-0 items-center justify-center',\n /* Widen the hit target without moving the visual line: the divider is\n a hairline, but a hairline is far too small to grab. */\n 'after:absolute after:inset-y-0 after:-inset-x-1 after:w-3',\n 'transition-colors ease-out hover:bg-primary',\n 'focus-visible:bg-primary focus-visible:outline-none',\n 'data-[orientation=vertical]:h-px data-[orientation=vertical]:w-full',\n 'data-[orientation=vertical]:after:inset-x-0 data-[orientation=vertical]:after:-inset-y-1 data-[orientation=vertical]:after:h-3 data-[orientation=vertical]:after:w-full',\n local.class\n )}\n {...rest}\n >\n {local.withHandle ? (\n <div class=\"bg-border z-(--z-docked) flex h-4 w-2.5 items-center justify-center rounded-sm border border-border\">\n <GripVertical class=\"size-2.5 text-muted-foreground\" />\n </div>\n ) : null}\n </Resizable.Handle>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAMO,oBAAoBJ,oBAAmC,KAAK;AAElE,SAAgBK,oBAAoBC,OAA8D;CAChG,MAAM,CAACE,OAAOC,QAAQR,WAAWK,OAAO,CAAC,OAAO,CAAC;CAEjD,OAAAI,gBACGN,kBAAkBO,UAAQ;EAACC,aAAaH,KAAKI,iBAAiBC,KAAAA;EAAS,IAAAC,WAAA;GAAA,OAAAL,gBACrEb,WAASmB,WAAA,EAAA,KAAA,WAAA;IAAA,OACDb,GAAG,uDAAuDK,MAAMD,KAAK;GAAC,EAAA,GACzEE,IAAI,CAAA;EAAA;CAAA,CAAA;AAIhB;;;;;;;;;;AAWA,SAASQ,cAAcC,OAAkC;CACvD,MAAMC,OAAO,IAAID,MAAME,QAAQC,OAAOC,SAASD,QAAQC,MAAM,CAAC;CAC9D,OAAOH,OAAO,OAAQA,OAAO,KAAKD,MAAMK,SAAS;AACnD;AAEA,SAAgBC,eAAelB,OAAoE;CACjG,MAAM,CAACE,OAAOC,QAAQR,WAAWK,OAAO,CAAC,SAAS,aAAa,CAAC;CAChE,MAAMoB,QAAQ7B,UAAUK,WAAWO,KAAKkB,SAAS;CACjD,MAAMC,gBAAgB1B,WAAWE,iBAAiB;CAElD,OAAAM,gBACGb,UAAU4B,OAAKT,WAAA;EAAA,IACda,cAAW;GAAA,OACTrB,MAAMqB,gBAAgBD,cAAc,IAAId,KAAAA,IAAYG,cAAcS,MAAMR,MAAM,CAAC;EAAE;EAAA,KAAA,WAAA;GAAA,OAE5Ef,GAAG,mCAAmCK,MAAMD,KAAK;EAAC;CAAA,GACrDE,IAAI,CAAA;AAGd;AAcA,SAAgByB,gBAAgB5B,OAA6B;CAC3D,MAAM,CAACE,OAAOC,QAAQR,WAAWK,OAAO;EAAC;EAAS;EAAc;CAAO,CAAC;CACxE,MAAMoB,QAAQ7B,UAAUK,WAAWO,KAAKkB,SAAS;CAEjD,OAAAjB,gBACGb,UAAUkC,QAAMf,WAAA;EAAA,KAAA,gBAAA;GAAA,OACHR,MAAMyB,SAAS;EAAe;EAAA,KAAA,sBAAA;GAAA,OAIxBP,MAAMW,YAAY,MAAM,eAAe,aAAa;EAAY;EAAA,KAAA,WAAA;GAAA,OAC3ElC,GACL,kFAGA,6DACA,+CACA,uDACA,uEACA,2KACAK,MAAMD,KACR;EAAC;CAAA,GACGE,MAAI,EAAA,IAAAM,WAAA;EAAA,OAEPuB,WAAA,CAAA,CAAA9B,MAAMwB,UAAU,CAAA,CAAA,WAAA;GAAA,IAAAO,OAAAC,OAAA;GAAAC,OAAAF,MAAA7B,gBAEZZ,cAAY,EAAA,SAAA,iCAAA,CAAA,CAAA;GAAA,OAAAyC;EAAA,EAAA,CAAA,IAEb;CAAI,EAAA,CAAA,CAAA;AAGd"}
@@ -20,7 +20,7 @@ var DZ = (s) => {
20
20
  }
21
21
  return out;
22
22
  };
23
- var GROUP_COUNT = 387;
23
+ var GROUP_COUNT = 384;
24
24
  var customValidatorNames = [];
25
25
  var edgeStart = PS(U("E0500002005282000000002000150000020021820000011200000003022202000300004200120000200420001200021200301200010400162000010000220021010:2192001200220012000220012000200200200400010200040000000000400200108200110100000022010313000162002000020020012020080213000228200000000082000000000120002000120020020040101020300130001001010"));
26
26
  var labelStart = PS(U(":11111111211111119311546544411119731869:671397415686432441111111111161114151214313433415:78311132233313187211117221449443411141111151152226611131111112212518142224214215421421542142424242516171151615616347111111111197911327451111111111111111111113134714133513411111311111111111111111111112444411111342312715245411117:3"));
@@ -60,18 +60,18 @@ var nodeVlist = (() => {
60
60
  for (let i = 0; i < A.length; i++) out[A[i]] = V[i];
61
61
  return out;
62
62
  })();
63
- var SETS = "container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto fr max min px|none | auto full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate|px |auto |full | content none strict| inline-size size|layout |paint |style | around baseline between center center-safe end end-safe evenly normal start stretch| alias all-scroll auto cell col-resize context-menu copy crosshair default e-resize ew-resize grab grabbing help move n-resize ne-resize nesw-resize no-drop none not-allowed ns-resize nw-resize nwse-resize pointer progress row-resize s-resize se-resize sw-resize text vertical-text w-resize wait zoom-in zoom-out| dashed dotted double solid wavy| auto from-font|reverse |initial | in in-out initial linear out| col col-reverse row row-reverse| nowrap wrap wrap-reverse| auto initial none| black bold extrabold extralight light medium normal semibold thin| condensed expanded extra-condensed extra-expanded normal semi-condensed semi-expanded ultra-condensed ultra-expanded|flow- col col-dense dense row row-dense| none subgrid| auto dvh dvw fit full lh lvh lvw max min px screen svh svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs rail-item row-lg row-md row-sm statusbar topbar| block flex grid table| auto dvw fit full lvw max min px screen svw| loose none normal px relaxed snug tight|through |item | inside outside| decimal disc none| auto px| clip-border clip-content clip-fill clip-padding clip-stroke clip-view no-clip| add exclude intersect subtract| alpha luminance match|origin- border content fill padding stroke view|type- alpha luminance| circle ellipse| closest-corner closest-side farthest-corner farthest-side|at- bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| dvh fit full lh lvh max min none px screen svh| auto dvh dvw fit full lh lvh lvw max min none px screen svh svw| dvw fit full lvw max min none px screen svw| auto dvh dvw fit full lvh lvw max min none prose px svh svw| auto dvh dvw fit full lvh lvw max min none px screen svh svw| contain cover fill none scale-down| first last none| distant dramatic midrange near none normal|inset | full none|3d | auto smooth|gutter- auto both stable| auto none thin| inner none| auto dvh dvw fit full lvh lvw max min px svh svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs rail-item|base | center end justify left right start| clip ellipsis| balance nowrap pretty wrap| normal tight tighter wide wider widest| cpu gpu none| 3d flat| all colors none opacity shadow transform| discrete normal| full px| auto dvh dvw fit full lvh lvw max min px screen svh svw| rail rail-expanded sidebar sidebar-compact| auto contents scroll transform".split("|").map((s) => {
63
+ var SETS = "container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs fr max min px|none | auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px|auto |full | content none strict| inline-size size|layout |paint |style | around baseline between center center-safe end end-safe evenly normal start stretch| alias all-scroll auto cell col-resize context-menu copy crosshair default e-resize ew-resize grab grabbing help move n-resize ne-resize nesw-resize no-drop none not-allowed ns-resize nw-resize nwse-resize pointer progress row-resize s-resize se-resize sw-resize text vertical-text w-resize wait zoom-in zoom-out| dashed dotted double solid wavy| auto from-font|reverse |initial | in in-out initial linear out| col col-reverse row row-reverse| nowrap wrap wrap-reverse| auto initial none| black bold extrabold extralight light medium normal semibold thin| condensed expanded extra-condensed extra-expanded normal semi-condensed semi-expanded ultra-condensed ultra-expanded|flow- col col-dense dense row row-dense| none subgrid| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| block flex grid table| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min px screen svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs loose none normal px relaxed snug tight|through |item | inside outside| decimal disc none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px| clip-border clip-content clip-fill clip-padding clip-stroke clip-view no-clip| add exclude intersect subtract| alpha luminance match|origin- border content fill padding stroke view|type- alpha luminance| circle ellipse| closest-corner closest-side farthest-corner farthest-side|at- bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min none px screen svh| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min none px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min none px screen svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none prose px rail rail-expanded sidebar sidebar-compact svh svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none px rail rail-expanded screen sidebar sidebar-compact svh svw| contain cover fill none scale-down| first last none| distant dramatic midrange near none normal|inset | full none|3d | auto smooth|gutter- auto both stable| auto none thin| inner none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail-item svh svw|base | center end justify left right start| clip ellipsis| balance nowrap pretty wrap| normal tight tighter wide wider widest| cpu gpu none| 3d flat| all colors none opacity shadow transform| discrete normal| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail rail-expanded screen sidebar sidebar-compact svh svw| auto contents scroll transform".split("|").map((s) => {
64
64
  const tails = s.split(" ");
65
65
  const prefix = tails.shift();
66
66
  for (let i = 0; i < tails.length; i++) tails[i] = prefix + tails[i];
67
67
  return tails;
68
68
  });
69
- var AA = DZ("0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:44224000020460442224262200266426424062026224222824220022400000000\\00N222422242222222224062242222222422226264222422222222222222442804222422222222222222222222220<40<02042600024440202042244022");
70
- var AG = DZ("ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ24ɐɋƸƵ222]d24242ǖǓƚÆȭ2263ȪȧȪ2222222ǥ222222222222222222DŽƿ2ǀƷ2222222422222ƞƓ22222222222222222222144Ũť22Ťš222222222222222222222ĺ2ij6İħĪħĪɥŰ4Ĥ¯²ġ822ĘĕĘ2ė22226Čĉ2");
71
- var AS = DZ("02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\222IL0cf2e10j2222U00X2022]`2{0000120~}€„22‡Š‰:22~22222222222G000sˆOVI00000œ2>40000ŽŸB00000Iª«000®00000000000000021M°¯00²•000000000000000000000˜2222ŸHGHa1¾222Ã2Ä2222ÍÐ000±´22·");
72
- var litAnchor = /* @__PURE__ */ new Int32Array(1020);
73
- var litGroup = /* @__PURE__ */ new Int32Array(1020);
74
- var litPool = /* @__PURE__ */ new Int32Array(1020);
69
+ var AA = DZ("0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:4422400002046044222426220026642642462026224222824220022400000000\\00N222422242222222224062242222222422226264222422222222222222442804222422222222222222222222220<4<0204260002444020204224422");
70
+ var AG = DZ("ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ244ƸƵ222]d24242ǖǓƚÄȫ2263ȨȥȨ2222222ǣ222222222222222222ǂƽ2ƾƵ2222222422222ƜƑ22222222222222222222144Ŧţ22Ţş222222222222222222222ĸ2ı68ĦģĦɡŰ4Ġ«®ĝ822ĔđĔ2ē2222622");
71
+ var AS = DZ("02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\222IL0cf2e10j2222U00X202[^2y0000120|{~‚22…ˆ‡:22|22222222222G000q†OVI00000}š2›>40000ŒB00000I¨©000¬00000000000000021M®­00°“000000000000000000000–222›HGHa1º222¿2À2222ÉÌ000­°2±");
72
+ var litAnchor = /* @__PURE__ */ new Int32Array(1635);
73
+ var litGroup = /* @__PURE__ */ new Int32Array(1635);
74
+ var litPool = /* @__PURE__ */ new Int32Array(1635);
75
75
  var poolText = "";
76
76
  var poolOffsets = /* @__PURE__ */ new Int32Array(1072);
77
77
  {
@@ -93,9 +93,9 @@ var poolOffsets = /* @__PURE__ */ new Int32Array(1072);
93
93
  e++;
94
94
  }
95
95
  }
96
- var adjGid = DZ("0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\6N22222Z222D222t");
96
+ var adjGid = DZ("0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\6N22222Z222D222p");
97
97
  var adjStart = PS(U("1::24444432:442:44:44>222222:44:4421322511111311111114"));
98
- var adjTgt = DZ("2Š4A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅҜ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=„ƧNž2Ĕé242L222290000f22500ɛ000ǘ222");
98
+ var adjTgt = DZ("2Š4A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅҜ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=„ƧNž2Đå242L222290000f22500ɛ000ǘ222");
99
99
  var patGid = U("ij");
100
100
  var patTgt = U("—");
101
101
  var postfixLookupGroups = U("1");
@@ -1 +1 @@
1
- {"version":3,"file":"cn-tables.generated.js","names":[],"sources":["../../src/lib/cn-tables.generated.ts"],"sourcesContent":["/*\n * Generated class-group tables from cn@0.4.0 by cn/build, using the complete\n * config and no source scanning. cn is Copyright (c) 2026 shadcn, MIT licensed.\n * This MIT notice is retained because the generated decoder is distributed in\n * this file and in the standalone registry payload.\n *\n * MIT License\n *\n * Copyright (c) 2026 shadcn\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// GENERATED by `cn build` — do not edit.\n// Pair with createCn from \"cn/engine\":\n// import tables from \"./cn-tables.generated.ts\"\n// import { createCn } from \"cn/engine\"\n// export const cn = createCn(tables)\nconst P = 48\nconst U = (s: string, o = 0): Int32Array => {\n const out = new Int32Array(s.length)\n for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) - P - o\n return out\n}\nconst PS = (counts: Int32Array): Int32Array => {\n const out = new Int32Array(counts.length + 1)\n for (let i = 0; i < counts.length; i++) out[i + 1] = out[i]! + counts[i]!\n return out\n}\n// zigzag-delta stream → running values\nconst DZ = (s: string): Int32Array => {\n const out = new Int32Array(s.length)\n let a = 0\n for (let i = 0; i < s.length; i++) {\n const z = s.charCodeAt(i) - P\n a += (z >>> 1) ^ -(z & 1)\n out[i] = a\n }\n return out\n}\nconst GROUP_COUNT = 387\nconst customValidatorNames: string[] = []\nconst edgeStart = PS(U(\"E0500002005282000000002000150000020021820000011200000003022202000300004200120000200420001200021200301200010400162000010000220021010:2192001200220012000220012000200200200400010200040000000000400200108200110100000022010313000162002000020020012020080213000228200000000082000000000120002000120020020040101020300130001001010\"))\nconst labelStart = PS(U(\":11111111211111119311546544411119731869:671397415686432441111111111161114151214313433415:78311132233313187211117221449443411141111151152226611131111112212518142224214215421421542142424242516171151615616347111111111197911327451111111111111111111113134714133513411111311111111111111111111112444411111342312715245411117:3\"))\nconst labelText = \"@containerabcdefghinlmoprstunderlineviawzccentlignnimatespectuto-colsrowsaglorightnessckdrop-sisbcontrastfiltergrayscalehue-rotateinvertopacityslurrightnessaturateepia-coniclinearpositionradialsizeockurrderttom-belrstxyespacing-xyaretoursorlnt-umnsendspantartainentrasteividerop-shadowurationcorationlay-xyasendillexontromlter-featuresstretchapr-xyayscaleidow-colsrowsue-rotatedentlinesetvert-beringsxyeshadoweiadingftnest-clamp-imageabein-lrstxyskx--b-coniclpositionrsizet-x-y-fromto-fromto-inearfromto-fromto-adialfromto-fromtofromtofromtofromtoblockhinlinew-screenesblockhinlinewbjectpacityrutlinederigin-offsetbelrstxyesrspective-originaceholderioghtng-offsettateundedw-xyz-belrstlreseslr-endspantartaturatecepiahizekewpace-taleroll-xyz-barmpbelrstxyesbelrstxyes-thumbrackadowrink-xyxyartrokeabextora-shadowpckingnsformitionlate-xyz-offsetill-changeoom\"\n// pre-order tree: targets derived from edge counts via subtree sizes\nconst edgeTarget = (() => {\n const N = edgeStart.length - 1\n const sizes = new Int32Array(N)\n for (let i = N - 1; i >= 0; i--) {\n let s = 1\n let c = i + 1\n for (let k = edgeStart[i]!; k < edgeStart[i + 1]!; k++) { s += sizes[c]!; c += sizes[c]! }\n sizes[i] = s\n }\n const out = new Int32Array(edgeStart[N]!)\n let e = 0\n for (let i = 0; i < N; i++) {\n let c = i + 1\n for (let k = edgeStart[i]!; k < edgeStart[i + 1]!; k++) { out[e++] = c; c += sizes[c]! }\n }\n return out\n})()\nconst nodeGroup = U(\"02000000000000900<=0?000B000F00F00ŏI0J0LNPRTVX0000]_a00000000000000000000000rst0000000zŏ00000000000…ŏ000ˆ0000ŏ0000000000—0000000000000000000000000000000000000000000000000000Ë000000000000000000000Þ000000000000000000ð0000000ø0ùúûüýþÿĀāĂ㥹Ć000000000000000000000000000000000000000000ħ0ĨĪ00000000000000000000ļĽ00000Ŭ000000\", 1)\n// vlists = op-pattern pool + per-list refs; the engine indexes these directly\nconst vlistPat = PS(U(\"123333359346463635126536711576\"))\nconst vlistOps = U(\"93203242332583253248325D>E?F@03263243255B:032523853:0325B:8GA032542H<C=12727B:0328432553;D>E?3257D>032585:0325B:;0328B:032\")\nconst vlistRef = U(\"012113445661666666789111:5;;;;;;;;444;;;:62999<1161=62>>?61:21@ABCD4446996:64E:::;:?::64:F114GHHIHHHHIHH1HH1HH1HHHHHH::EEJ4444::EE4444441691;644444114244444:;K6666555555555555555999666664444444444444444444444226?6:66644L9M?D:111::::6DE199\")\nconst vlistGroup = DZ(\"020200202020020020020020020020200200200200200200200002020202001003040106000200200200200200200200200200200200200200200200200200200200200200200200200200200200020020020020020020002020200202002002002002002002002002002020002002020020200220200200200200200200200200200200020020020000200020002000200200200020020020002000200200200020020202002020202000200200020022000200200020020002002000200220002002000200W0Z00020020002002020002002000200g0j0002002000200200020020002002000200200020020002000200002000002002002002002000200020000200002002002002002002002020020020200200200200200200200200202020020020020020020020020002002002020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020002002002002002002000200200200200200200200200200020202020002000200020002002002002000020200200\")\n// nodeVlist rebuilt sparse: (anchor deltas, vlist ids)\nconst nodeVlist = (() => {\n const out = new Int32Array(319).fill(-1)\n const A = DZ(\"02422242:222222242224222242442222222422222244442242226224222426222422442462222422622222222626222462242622422622422424242422222222422222222242422222222222222222622442224222222222222224424442262222222222222222222226224222424242422224422422422222\")\n const V = DZ(\"02222222222222222222202222222222222222222222221422222222222222222222222222222222222Y\\\\222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221422222222222222222222222222222222222222Ŀł222222222222222222\")\n for (let i = 0; i < A.length; i++) out[A[i]!] = V[i]!\n return out\n})()\nconst SETS = \"container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto fr max min px|none | auto full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate|px |auto |full | content none strict| inline-size size|layout |paint |style | around baseline between center center-safe end end-safe evenly normal start stretch| alias all-scroll auto cell col-resize context-menu copy crosshair default e-resize ew-resize grab grabbing help move n-resize ne-resize nesw-resize no-drop none not-allowed ns-resize nw-resize nwse-resize pointer progress row-resize s-resize se-resize sw-resize text vertical-text w-resize wait zoom-in zoom-out| dashed dotted double solid wavy| auto from-font|reverse |initial | in in-out initial linear out| col col-reverse row row-reverse| nowrap wrap wrap-reverse| auto initial none| black bold extrabold extralight light medium normal semibold thin| condensed expanded extra-condensed extra-expanded normal semi-condensed semi-expanded ultra-condensed ultra-expanded|flow- col col-dense dense row row-dense| none subgrid| auto dvh dvw fit full lh lvh lvw max min px screen svh svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs rail-item row-lg row-md row-sm statusbar topbar| block flex grid table| auto dvw fit full lvw max min px screen svw| loose none normal px relaxed snug tight|through |item | inside outside| decimal disc none| auto px| clip-border clip-content clip-fill clip-padding clip-stroke clip-view no-clip| add exclude intersect subtract| alpha luminance match|origin- border content fill padding stroke view|type- alpha luminance| circle ellipse| closest-corner closest-side farthest-corner farthest-side|at- bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| dvh fit full lh lvh max min none px screen svh| auto dvh dvw fit full lh lvh lvw max min none px screen svh svw| dvw fit full lvw max min none px screen svw| auto dvh dvw fit full lvh lvw max min none prose px svh svw| auto dvh dvw fit full lvh lvw max min none px screen svh svw| contain cover fill none scale-down| first last none| distant dramatic midrange near none normal|inset | full none|3d | auto smooth|gutter- auto both stable| auto none thin| inner none| auto dvh dvw fit full lvh lvw max min px svh svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs rail-item|base | center end justify left right start| clip ellipsis| balance nowrap pretty wrap| normal tight tighter wide wider widest| cpu gpu none| 3d flat| all colors none opacity shadow transform| discrete normal| full px| auto dvh dvw fit full lvh lvw max min px screen svh svw| rail rail-expanded sidebar sidebar-compact| auto contents scroll transform\".split('|').map((s) => {\n const tails = s.split(' ')\n const prefix = tails.shift()!\n for (let i = 0; i < tails.length; i++) {\n tails[i] = prefix + tails[i]\n }\n return tails\n})\nconst AA = DZ(\"0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:44224000020460442224262200266426424062026224222824220022400000000\\\\00N222422242222222224062242222222422226264222422222222222222442804222422222222222222222222220<40<02042600024440202042244022\")\nconst AG = DZ(\"ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ24ɐɋƸƵ222]d24242ǖǓƚÆȭ2263ȪȧȪ2222222ǥ222222222222222222DŽƿ2ǀƷ2222222422222ƞƓ22222222222222222222144Ũť22Ťš222222222222222222222ĺ2ij6İħĪħĪɥŰ4Ĥ¯²ġ822ĘĕĘ2ė22226Čĉ2\")\nconst AS = DZ(\"02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\\\222IL0cf2e10j2222U00X2022]`2{0000120~}€„22‡Š‰:22~22222222222G000sˆOVI00000œ2>40000ŽŸB00000Iª«000®00000000000000021M°¯00²•000000000000000000000˜2222ŸHGHa1¾222Ã2Ä2222ÍÐ000±´22·\")\nconst litAnchor = new Int32Array(1020)\nconst litGroup = new Int32Array(1020)\nconst litPool = new Int32Array(1020)\nlet poolText = ''\nconst poolOffsets = new Int32Array(1072)\n{\n const tailRef = new Map()\n let nextRef = 0\n let e = 0\n for (let i = 0; i < AA.length; i++) {\n for (const tail of SETS[AS[i]!]!) {\n let r = tailRef.get(tail)\n if (r === undefined) {\n r = nextRef++\n tailRef.set(tail, r)\n poolOffsets[r * 2] = poolText.length\n poolOffsets[r * 2 + 1] = tail.length\n poolText += tail\n }\n litAnchor[e] = AA[i]!\n litGroup[e] = AG[i]!\n litPool[e] = r\n e++\n }\n }\n}\n// conflict adjacency (engine builds claim bitmask CSR at init)\nconst adjGid = DZ(\"0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\\\6N22222Z222D222t\")\nconst adjStart = PS(U(\"1::24444432:442:44:44>222222:44:4421322511111311111114\"))\nconst adjTgt = DZ(\"2Š4A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅҜ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=„ƧNž2Ĕé242L222290000f22500ɛ000ǘ222\")\nconst patGid = U(\"ij\")\nconst patTgt = U(\"—\")\nconst postfixLookupGroups = U(\"1\")\nconst orderSensitiveModifiers = \"* ** after backdrop before details-content file first-letter first-line marker placeholder selection\"\nexport default {\n GROUP_COUNT, customValidatorNames, edgeStart, labelStart, labelText,\n edgeTarget, nodeGroup, nodeVlist, vlistPat, vlistOps, vlistRef, vlistGroup,\n litAnchor, litGroup, litPool, poolOffsets, poolText,\n adjGid, adjStart, adjTgt, patGid, patTgt, postfixLookupGroups,\n orderSensitiveModifiers,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cn-tables.generated.js","names":[],"sources":["../../src/lib/cn-tables.generated.ts"],"sourcesContent":["/*\n * Generated class-group tables from cn@0.4.0 by cn/build, using the complete\n * config and no source scanning. cn is Copyright (c) 2026 shadcn, MIT licensed.\n * This MIT notice is retained because the generated decoder is distributed in\n * this file and in the standalone registry payload.\n *\n * MIT License\n *\n * Copyright (c) 2026 shadcn\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n// GENERATED by `cn build` — do not edit.\n// Pair with createCn from \"cn/engine\":\n// import tables from \"./cn-tables.generated.ts\"\n// import { createCn } from \"cn/engine\"\n// export const cn = createCn(tables)\nconst P = 48\nconst U = (s: string, o = 0): Int32Array => {\n const out = new Int32Array(s.length)\n for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) - P - o\n return out\n}\nconst PS = (counts: Int32Array): Int32Array => {\n const out = new Int32Array(counts.length + 1)\n for (let i = 0; i < counts.length; i++) out[i + 1] = out[i]! + counts[i]!\n return out\n}\n// zigzag-delta stream → running values\nconst DZ = (s: string): Int32Array => {\n const out = new Int32Array(s.length)\n let a = 0\n for (let i = 0; i < s.length; i++) {\n const z = s.charCodeAt(i) - P\n a += (z >>> 1) ^ -(z & 1)\n out[i] = a\n }\n return out\n}\nconst GROUP_COUNT = 384\nconst customValidatorNames: string[] = []\nconst edgeStart = PS(U(\"E0500002005282000000002000150000020021820000011200000003022202000300004200120000200420001200021200301200010400162000010000220021010:2192001200220012000220012000200200200400010200040000000000400200108200110100000022010313000162002000020020012020080213000228200000000082000000000120002000120020020040101020300130001001010\"))\nconst labelStart = PS(U(\":11111111211111119311546544411119731869:671397415686432441111111111161114151214313433415:78311132233313187211117221449443411141111151152226611131111112212518142224214215421421542142424242516171151615616347111111111197911327451111111111111111111113134714133513411111311111111111111111111112444411111342312715245411117:3\"))\nconst labelText = \"@containerabcdefghinlmoprstunderlineviawzccentlignnimatespectuto-colsrowsaglorightnessckdrop-sisbcontrastfiltergrayscalehue-rotateinvertopacityslurrightnessaturateepia-coniclinearpositionradialsizeockurrderttom-belrstxyespacing-xyaretoursorlnt-umnsendspantartainentrasteividerop-shadowurationcorationlay-xyasendillexontromlter-featuresstretchapr-xyayscaleidow-colsrowsue-rotatedentlinesetvert-beringsxyeshadoweiadingftnest-clamp-imageabein-lrstxyskx--b-coniclpositionrsizet-x-y-fromto-fromto-inearfromto-fromto-adialfromto-fromtofromtofromtofromtoblockhinlinew-screenesblockhinlinewbjectpacityrutlinederigin-offsetbelrstxyesrspective-originaceholderioghtng-offsettateundedw-xyz-belrstlreseslr-endspantartaturatecepiahizekewpace-taleroll-xyz-barmpbelrstxyesbelrstxyes-thumbrackadowrink-xyxyartrokeabextora-shadowpckingnsformitionlate-xyz-offsetill-changeoom\"\n// pre-order tree: targets derived from edge counts via subtree sizes\nconst edgeTarget = (() => {\n const N = edgeStart.length - 1\n const sizes = new Int32Array(N)\n for (let i = N - 1; i >= 0; i--) {\n let s = 1\n let c = i + 1\n for (let k = edgeStart[i]!; k < edgeStart[i + 1]!; k++) { s += sizes[c]!; c += sizes[c]! }\n sizes[i] = s\n }\n const out = new Int32Array(edgeStart[N]!)\n let e = 0\n for (let i = 0; i < N; i++) {\n let c = i + 1\n for (let k = edgeStart[i]!; k < edgeStart[i + 1]!; k++) { out[e++] = c; c += sizes[c]! }\n }\n return out\n})()\nconst nodeGroup = U(\"02000000000000900<=0?000B000F00F00ŏI0J0LNPRTVX0000]_a00000000000000000000000rst0000000zŏ00000000000…ŏ000ˆ0000ŏ0000000000—0000000000000000000000000000000000000000000000000000Ë000000000000000000000Þ000000000000000000ð0000000ø0ùúûüýþÿĀāĂ㥹Ć000000000000000000000000000000000000000000ħ0ĨĪ00000000000000000000ļĽ00000Ŭ000000\", 1)\n// vlists = op-pattern pool + per-list refs; the engine indexes these directly\nconst vlistPat = PS(U(\"123333359346463635126536711576\"))\nconst vlistOps = U(\"93203242332583253248325D>E?F@03263243255B:032523853:0325B:8GA032542H<C=12727B:0328432553;D>E?3257D>032585:0325B:;0328B:032\")\nconst vlistRef = U(\"012113445661666666789111:5;;;;;;;;444;;;:62999<1161=62>>?61:21@ABCD4446996:64E:::;:?::64:F114GHHIHHHHIHH1HH1HH1HHHHHH::EEJ4444::EE4444441691;644444114244444:;K6666555555555555555999666664444444444444444444444226?6:66644L9M?D:111::::6DE199\")\nconst vlistGroup = DZ(\"020200202020020020020020020020200200200200200200200002020202001003040106000200200200200200200200200200200200200200200200200200200200200200200200200200200200020020020020020020002020200202002002002002002002002002002020002002020020200220200200200200200200200200200200020020020000200020002000200200200020020020002000200200200020020202002020202000200200020022000200200020020002002000200220002002000200W0Z00020020002002020002002000200g0j0002002000200200020020002002000200200020020002000200002000002002002002002000200020000200002002002002002002002020020020200200200200200200200200202020020020020020020020020002002002020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020020002002002002002002000200200200200200200200200200020202020002000200020002002002002000020200200\")\n// nodeVlist rebuilt sparse: (anchor deltas, vlist ids)\nconst nodeVlist = (() => {\n const out = new Int32Array(319).fill(-1)\n const A = DZ(\"02422242:222222242224222242442222222422222244442242226224222426222422442462222422622222222626222462242622422622422424242422222222422222222242422222222222222222622442224222222222222224424442262222222222222222222226224222424242422224422422422222\")\n const V = DZ(\"02222222222222222222202222222222222222222222221422222222222222222222222222222222222Y\\\\222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221422222222222222222222222222222222222222Ŀł222222222222222222\")\n for (let i = 0; i < A.length; i++) out[A[i]!] = V[i]!\n return out\n})()\nconst SETS = \"container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs fr max min px|none | auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px|auto |full | content none strict| inline-size size|layout |paint |style | around baseline between center center-safe end end-safe evenly normal start stretch| alias all-scroll auto cell col-resize context-menu copy crosshair default e-resize ew-resize grab grabbing help move n-resize ne-resize nesw-resize no-drop none not-allowed ns-resize nw-resize nwse-resize pointer progress row-resize s-resize se-resize sw-resize text vertical-text w-resize wait zoom-in zoom-out| dashed dotted double solid wavy| auto from-font|reverse |initial | in in-out initial linear out| col col-reverse row row-reverse| nowrap wrap wrap-reverse| auto initial none| black bold extrabold extralight light medium normal semibold thin| condensed expanded extra-condensed extra-expanded normal semi-condensed semi-expanded ultra-condensed ultra-expanded|flow- col col-dense dense row row-dense| none subgrid| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| block flex grid table| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min px screen svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs loose none normal px relaxed snug tight|through |item | inside outside| decimal disc none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px| clip-border clip-content clip-fill clip-padding clip-stroke clip-view no-clip| add exclude intersect subtract| alpha luminance match|origin- border content fill padding stroke view|type- alpha luminance| circle ellipse| closest-corner closest-side farthest-corner farthest-side|at- bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min none px screen svh| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min none px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min none px screen svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none prose px rail rail-expanded sidebar sidebar-compact svh svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none px rail rail-expanded screen sidebar sidebar-compact svh svw| contain cover fill none scale-down| first last none| distant dramatic midrange near none normal|inset | full none|3d | auto smooth|gutter- auto both stable| auto none thin| inner none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail-item svh svw|base | center end justify left right start| clip ellipsis| balance nowrap pretty wrap| normal tight tighter wide wider widest| cpu gpu none| 3d flat| all colors none opacity shadow transform| discrete normal| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail rail-expanded screen sidebar sidebar-compact svh svw| auto contents scroll transform\".split('|').map((s) => {\n const tails = s.split(' ')\n const prefix = tails.shift()!\n for (let i = 0; i < tails.length; i++) {\n tails[i] = prefix + tails[i]\n }\n return tails\n})\nconst AA = DZ(\"0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:4422400002046044222426220026642642462026224222824220022400000000\\\\00N222422242222222224062242222222422226264222422222222222222442804222422222222222222222222220<4<0204260002444020204224422\")\nconst AG = DZ(\"ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ244ƸƵ222]d24242ǖǓƚÄȫ2263ȨȥȨ2222222ǣ222222222222222222ǂƽ2ƾƵ2222222422222ƜƑ22222222222222222222144Ŧţ22Ţş222222222222222222222ĸ2ı68ĦģĦɡŰ4Ġ«®ĝ822ĔđĔ2ē2222622\")\nconst AS = DZ(\"02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\\\222IL0cf2e10j2222U00X202[^2y0000120|{~‚22…ˆ‡:22|22222222222G000q†OVI00000}š2›>40000ŒB00000I¨©000¬00000000000000021M®­00°“000000000000000000000–222›HGHa1º222¿2À2222ÉÌ000­°2±\")\nconst litAnchor = new Int32Array(1635)\nconst litGroup = new Int32Array(1635)\nconst litPool = new Int32Array(1635)\nlet poolText = ''\nconst poolOffsets = new Int32Array(1072)\n{\n const tailRef = new Map()\n let nextRef = 0\n let e = 0\n for (let i = 0; i < AA.length; i++) {\n for (const tail of SETS[AS[i]!]!) {\n let r = tailRef.get(tail)\n if (r === undefined) {\n r = nextRef++\n tailRef.set(tail, r)\n poolOffsets[r * 2] = poolText.length\n poolOffsets[r * 2 + 1] = tail.length\n poolText += tail\n }\n litAnchor[e] = AA[i]!\n litGroup[e] = AG[i]!\n litPool[e] = r\n e++\n }\n }\n}\n// conflict adjacency (engine builds claim bitmask CSR at init)\nconst adjGid = DZ(\"0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\\\6N22222Z222D222p\")\nconst adjStart = PS(U(\"1::24444432:442:44:44>222222:44:4421322511111311111114\"))\nconst adjTgt = DZ(\"2Š4A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅҜ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=„ƧNž2Đå242L222290000f22500ɛ000ǘ222\")\nconst patGid = U(\"ij\")\nconst patTgt = U(\"—\")\nconst postfixLookupGroups = U(\"1\")\nconst orderSensitiveModifiers = \"* ** after backdrop before details-content file first-letter first-line marker placeholder selection\"\nexport default {\n GROUP_COUNT, customValidatorNames, edgeStart, labelStart, labelText,\n edgeTarget, nodeGroup, nodeVlist, vlistPat, vlistOps, vlistRef, vlistGroup,\n litAnchor, litGroup, litPool, poolOffsets, poolText,\n adjGid, adjStart, adjTgt, patGid, patTgt, postfixLookupGroups,\n orderSensitiveModifiers,\n}\n"],"mappings":"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"}
package/dist/r/chart.json CHANGED
@@ -11,6 +11,11 @@
11
11
  "lib"
12
12
  ],
13
13
  "files": [
14
+ {
15
+ "path": "src/components/ui/chart/chart-options.ts",
16
+ "type": "registry:ui",
17
+ "target": "components/ui/chart/chart-options.ts"
18
+ },
14
19
  {
15
20
  "path": "src/components/ui/chart/chart.tsx",
16
21
  "type": "registry:ui",
@@ -325,6 +325,11 @@
325
325
  "lib"
326
326
  ],
327
327
  "files": [
328
+ {
329
+ "path": "src/components/ui/chart/chart-options.ts",
330
+ "type": "registry:ui",
331
+ "target": "components/ui/chart/chart-options.ts"
332
+ },
328
333
  {
329
334
  "path": "src/components/ui/chart/chart.tsx",
330
335
  "type": "registry:ui",
@@ -60,7 +60,11 @@ export function OrbitLayout(props: OrbitLayoutProps) {
60
60
  export type OrbitItemProps = Omit<ComponentProps<'div'>, 'style'> & {
61
61
  /** JSX style props are owned by this geometry primitive. */
62
62
  style?: never
63
- /** Zero-based position in the rendered sequence. */
63
+ /**
64
+ * Zero-based position in the rendered sequence. Index 0 sits at three o'clock
65
+ * (the positive x axis) and the sequence runs clockwise, because the y axis
66
+ * points down the screen: with four items, 0 is east, 1 south, 2 west, 3 north.
67
+ */
64
68
  index: number
65
69
  /** Number of items sharing this orbit. */
66
70
  count: number
@@ -205,7 +205,10 @@ export type SideRailItemProps<T extends ValidComponent = 'a'> = PolymorphicProps
205
205
  * being deleted.
206
206
  */
207
207
  label: string
208
- /** A count or a dot, rendered over the icon's corner. */
208
+ /**
209
+ * A count or a dot. Expanded, it trails the label at the row's end; collapsed,
210
+ * it moves onto the icon's corner, so the rail never loses it.
211
+ */
209
212
  badge?: JSX.Element
210
213
  /** An indicator pinned to the trailing edge in the expanded form. */
211
214
  trailing?: JSX.Element
@@ -258,6 +261,7 @@ export function SideRailItem<T extends ValidComponent = 'a'>(props: SideRailItem
258
261
  data-active={local.active ? '' : undefined}
259
262
  class={cn(
260
263
  sideRailItemClass,
264
+ 'relative',
261
265
  local.active ? sideRailItemStateClass.active : sideRailItemStateClass.idle,
262
266
  local.class
263
267
  )}
@@ -267,24 +271,33 @@ export function SideRailItem<T extends ValidComponent = 'a'>(props: SideRailItem
267
271
  onBlur={hideTip}
268
272
  {...(rest as Record<string, unknown>)}
269
273
  >
270
- <Show when={local.badge}>
271
- <span class="relative flex size-5 shrink-0 items-center justify-center [&_svg]:size-5">
272
- {local.children}
273
- <span class="absolute -top-1 -end-1 flex items-center justify-center">
274
- {local.badge}
275
- </span>
276
- </span>
277
- </Show>
278
- <Show when={!local.badge}>
279
- <span class="flex size-5 shrink-0 items-center justify-center [&_svg]:size-5">
280
- {local.children}
281
- </span>
282
- </Show>
274
+ <span class="flex size-5 shrink-0 items-center justify-center [&_svg]:size-5">
275
+ {local.children}
276
+ </span>
283
277
 
284
- <span class="min-w-0 flex-1 truncate group-data-[collapsed=true]/rail:sr-only">
278
+ <span class="min-w-0 flex-1 truncate text-start group-data-[collapsed=true]/rail:sr-only">
285
279
  {local.label}
286
280
  </span>
287
281
 
282
+ {/*
283
+ * One element, two placements, because the badge is caller content and a DOM
284
+ * node cannot be in two places. Expanded, it is a trailing count in the row's
285
+ * flow, after the label — over the icon it would cover the glyph the row is
286
+ * recognised by. Collapsed, there is no label to trail, so it leaves the flow
287
+ * and pins to the icon's top-end corner: anchored to the row's centre (where
288
+ * the centred icon sits) and pushed out by 14px, the icon's half-width plus
289
+ * the 4px overhang, so a wider count grows back over the icon rather than past
290
+ * the rail's edge.
291
+ */}
292
+ <Show when={local.badge}>
293
+ <span
294
+ data-slot="side-rail-badge"
295
+ class="flex shrink-0 items-center justify-center group-data-[collapsed=true]/rail:absolute group-data-[collapsed=true]/rail:end-1/2 group-data-[collapsed=true]/rail:top-1/2 group-data-[collapsed=true]/rail:-me-3.5 group-data-[collapsed=true]/rail:-mt-3.5"
296
+ >
297
+ {local.badge}
298
+ </span>
299
+ </Show>
300
+
288
301
  <Show when={local.shortcut && local.trailing === undefined}>
289
302
  <span
290
303
  aria-hidden="true"
@@ -380,7 +393,7 @@ export function SideRailButton(
380
393
  <span class="flex size-5 shrink-0 items-center justify-center [&_svg]:size-5">
381
394
  {local.children}
382
395
  </span>
383
- <span class="min-w-0 flex-1 truncate group-data-[collapsed=true]/rail:sr-only">
396
+ <span class="min-w-0 flex-1 truncate text-start group-data-[collapsed=true]/rail:sr-only">
384
397
  {local.label}
385
398
  </span>
386
399
  <Show when={local.shortcut}>
@@ -182,7 +182,7 @@ export function SidebarNavSection(props: SidebarNavSectionProps) {
182
182
  })}
183
183
  />
184
184
  </Show>
185
- <span class="min-w-0 flex-1 truncate">{local.label}</span>
185
+ <span class="min-w-0 flex-1 truncate text-start">{local.label}</span>
186
186
  <Show when={local.count !== undefined}>
187
187
  <span class="shrink-0 tabular-nums text-muted-foreground">{local.count}</span>
188
188
  </Show>
@@ -290,7 +290,7 @@ export function SidebarNavLabel(props: ComponentProps<'span'>) {
290
290
  return (
291
291
  <span
292
292
  data-slot="sidebar-nav-label"
293
- class={cn('min-w-0 flex-1 truncate', local.class)}
293
+ class={cn('min-w-0 flex-1 truncate text-start', local.class)}
294
294
  {...rest}
295
295
  />
296
296
  )
@@ -14,14 +14,24 @@ import { Presence as MotionPresence } from 'solid-motionone'
14
14
  * this for mounting and unmounting, which is the split that keeps the common case
15
15
  * free of a runtime while making the rare case correct.
16
16
  *
17
- * <Show when={open()}>
18
- * <Presence initial={{ opacity: 0, scale: 0.96 }} exit={{ opacity: 0, scale: 0.96 }}>
19
- * <div>…</div>
20
- * </Presence>
21
- * </Show>
17
+ * <Presence exitBeforeEnter>
18
+ * <Show when={open()}>
19
+ * <Motion.div
20
+ * initial={{ opacity: 0, scale: 0.96 }}
21
+ * animate={{ opacity: 1, scale: 1 }}
22
+ * exit={{ opacity: 0, scale: 0.96 }}
23
+ * >
24
+ * …
25
+ * </Motion.div>
26
+ * </Show>
27
+ * </Presence>
22
28
  *
23
- * `Presence` keeps the child mounted until its exit finishes, so the `<Show>` above
24
- * can stay the only condition in the tree.
29
+ * `Presence` goes *outside* the condition: it has to outlive the `<Show>`'s child
30
+ * to keep that child mounted until its exit finishes. It takes only two booleans —
31
+ * `initial={false}` skips the enter animation on first render, `exitBeforeEnter`
32
+ * holds a replacement back until the outgoing element has left. The animation
33
+ * itself lives on the `Motion.*` element, which must be the direct child of the
34
+ * condition for its `exit` to run.
25
35
  */
26
36
  export type PresenceProps = ComponentProps<typeof MotionPresence> & {
27
37
  children?: JSX.Element
@@ -159,7 +159,11 @@ export function ThemePicker(props: ThemePickerProps) {
159
159
  role="radio"
160
160
  aria-checked={local.selectedId === theme.id}
161
161
  aria-label={`${theme.familyLabel} ${theme.label}`}
162
- class="h-auto flex-col gap-1.5 p-0 hover:bg-transparent"
162
+ // `justify-start`: the options in a wrapped row stretch to its tallest
163
+ // member, and an option whose label has a second line (the family)
164
+ // is that member. Centred, every shorter option's preview dropped below
165
+ // its neighbours'; pinned to the top, the previews share one line.
166
+ class="h-auto flex-col justify-start gap-1.5 p-0 hover:bg-transparent"
163
167
  onClick={() => local.onThemeSelect(theme)}
164
168
  >
165
169
  <ThemePreview theme={theme} selected={local.selectedId === theme.id} />