[READ-ONLY] Mirror of https://github.com/flo-bit/ui-kit. 🦊 fox ui, svelte 5 and tailwind 4 flo-bit.dev/ui-kit/
svelte tailwindcss ui-components
0

Configure Feed

Select the types of activity you want to include in your feed.

add toggles cards, add text editing v1, improve select theme

Florian (May 9, 2025, 10:52 PM +0200) 9fc83c38 32905973

+2076 -22
+663 -2
pnpm-lock.yaml
··· 63 63 '@fuxui/social': 64 64 specifier: workspace:* 65 65 version: link:../../packages/social 66 + '@fuxui/text': 67 + specifier: workspace:* 68 + version: link:../../packages/text 66 69 '@fuxui/time': 67 70 specifier: workspace:* 68 71 version: link:../../packages/time ··· 423 426 plyr: 424 427 specifier: ^3.7.8 425 428 version: 3.7.8 429 + devDependencies: 430 + '@eslint/compat': 431 + specifier: ^1.2.5 432 + version: 1.2.5(eslint@9.25.0) 433 + '@eslint/js': 434 + specifier: ^9.18.0 435 + version: 9.25.0 436 + '@sveltejs/adapter-auto': 437 + specifier: ^6.0.0 438 + version: 6.0.0(@sveltejs/kit@2.20.0) 439 + '@sveltejs/adapter-static': 440 + specifier: ^3.0.8 441 + version: 3.0.8(@sveltejs/kit@2.20.0) 442 + '@sveltejs/kit': 443 + specifier: ^2.16.0 444 + version: 2.20.0(@sveltejs/vite-plugin-svelte@5.0.3)(svelte@5.28.1)(vite@6.3.2) 445 + '@sveltejs/package': 446 + specifier: ^2.3.11 447 + version: 2.3.11(svelte@5.28.1)(typescript@5.8.2) 448 + '@sveltejs/vite-plugin-svelte': 449 + specifier: ^5.0.0 450 + version: 5.0.3(svelte@5.28.1)(vite@6.3.2) 451 + '@tailwindcss/forms': 452 + specifier: ^0.5.9 453 + version: 0.5.9(tailwindcss@4.1.5) 454 + '@tailwindcss/typography': 455 + specifier: ^0.5.15 456 + version: 0.5.15(tailwindcss@4.1.5) 457 + '@tailwindcss/vite': 458 + specifier: ^4.1.5 459 + version: 4.1.5(vite@6.3.2) 460 + eslint: 461 + specifier: ^9.18.0 462 + version: 9.25.0 463 + eslint-config-prettier: 464 + specifier: ^10.0.1 465 + version: 10.1.1(eslint@9.25.0) 466 + eslint-plugin-svelte: 467 + specifier: ^3.0.0 468 + version: 3.0.0(eslint@9.25.0)(svelte@5.28.1) 469 + globals: 470 + specifier: ^16.0.0 471 + version: 16.0.0 472 + prettier: 473 + specifier: ^3.4.2 474 + version: 3.5.2 475 + prettier-plugin-svelte: 476 + specifier: ^3.3.3 477 + version: 3.3.3(prettier@3.5.2)(svelte@5.28.1) 478 + prettier-plugin-tailwindcss: 479 + specifier: ^0.6.11 480 + version: 0.6.11(prettier-plugin-svelte@3.3.3)(prettier@3.5.2) 481 + svelte: 482 + specifier: ^5.0.0 483 + version: 5.28.1 484 + svelte-check: 485 + specifier: ^4.0.0 486 + version: 4.1.4(svelte@5.28.1)(typescript@5.8.2) 487 + tailwindcss: 488 + specifier: ^4.1.5 489 + version: 4.1.5 490 + typescript: 491 + specifier: ^5.0.0 492 + version: 5.8.2 493 + typescript-eslint: 494 + specifier: ^8.20.0 495 + version: 8.30.1(eslint@9.25.0)(typescript@5.8.2) 496 + vite: 497 + specifier: ^6.2.6 498 + version: 6.3.2 499 + 500 + packages/text: 501 + dependencies: 502 + '@fuxui/base': 503 + specifier: workspace:* 504 + version: link:../base 505 + '@tiptap/core': 506 + specifier: ^2.12.0 507 + version: 2.12.0(@tiptap/pm@2.12.0) 508 + '@tiptap/extension-bubble-menu': 509 + specifier: ^2.12.0 510 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 511 + '@tiptap/extension-code-block-lowlight': 512 + specifier: ^2.12.0 513 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/extension-code-block@2.12.0)(@tiptap/pm@2.12.0)(highlight.js@11.11.1)(lowlight@3.3.0) 514 + '@tiptap/extension-document': 515 + specifier: ^2.12.0 516 + version: 2.12.0(@tiptap/core@2.12.0) 517 + '@tiptap/extension-dropcursor': 518 + specifier: ^2.12.0 519 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 520 + '@tiptap/extension-history': 521 + specifier: ^2.12.0 522 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 523 + '@tiptap/extension-image': 524 + specifier: ^2.12.0 525 + version: 2.12.0(@tiptap/core@2.12.0) 526 + '@tiptap/extension-link': 527 + specifier: ^2.12.0 528 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 529 + '@tiptap/extension-paragraph': 530 + specifier: ^2.12.0 531 + version: 2.12.0(@tiptap/core@2.12.0) 532 + '@tiptap/extension-placeholder': 533 + specifier: ^2.12.0 534 + version: 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 535 + '@tiptap/extension-strike': 536 + specifier: ^2.12.0 537 + version: 2.12.0(@tiptap/core@2.12.0) 538 + '@tiptap/extension-text': 539 + specifier: ^2.12.0 540 + version: 2.12.0(@tiptap/core@2.12.0) 541 + '@tiptap/extension-underline': 542 + specifier: ^2.12.0 543 + version: 2.12.0(@tiptap/core@2.12.0) 544 + '@tiptap/starter-kit': 545 + specifier: ^2.12.0 546 + version: 2.12.0 547 + bits-ui: 548 + specifier: ^1.4.3 549 + version: 1.4.3(svelte@5.28.1) 550 + lowlight: 551 + specifier: ^3.3.0 552 + version: 3.3.0 426 553 devDependencies: 427 554 '@eslint/compat': 428 555 specifier: ^1.2.5 ··· 1316 1443 /@polka/url@1.0.0-next.28: 1317 1444 resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==, tarball: https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz} 1318 1445 1446 + /@popperjs/core@2.11.8: 1447 + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, tarball: https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz} 1448 + dev: false 1449 + 1450 + /@remirror/core-constants@3.0.0: 1451 + resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==, tarball: https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz} 1452 + dev: false 1453 + 1319 1454 /@rollup/pluginutils@5.1.4: 1320 1455 resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==, tarball: https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz} 1321 1456 engines: {node: '>=14.0.0'} ··· 1761 1896 - '@types/three' 1762 1897 dev: false 1763 1898 1899 + /@tiptap/core@2.12.0(@tiptap/pm@2.12.0): 1900 + resolution: {integrity: sha512-3qX8oGVKFFZzQ0vit+ZolR6AJIATBzmEmjAA0llFhWk4vf3v64p1YcXcJsOBsr5scizJu5L6RYWEFatFwqckRg==, tarball: https://registry.npmjs.org/@tiptap/core/-/core-2.12.0.tgz} 1901 + peerDependencies: 1902 + '@tiptap/pm': ^2.7.0 1903 + dependencies: 1904 + '@tiptap/pm': 2.12.0 1905 + dev: false 1906 + 1907 + /@tiptap/extension-blockquote@2.12.0(@tiptap/core@2.12.0): 1908 + resolution: {integrity: sha512-XUC2A77YAPMJS2SqZ2S62IGcUH8gZ7cdhoWlYQb1pR4ZzXFByeKDJPxfYeAePSiuI01YGrlzgY2c6Ncx/DtO0A==, tarball: https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.12.0.tgz} 1909 + peerDependencies: 1910 + '@tiptap/core': ^2.7.0 1911 + dependencies: 1912 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1913 + dev: false 1914 + 1915 + /@tiptap/extension-bold@2.12.0(@tiptap/core@2.12.0): 1916 + resolution: {integrity: sha512-lAUtoLDLRc5ofD2I9MFY6MQ7d1qBLLqS1rvpwaPjOaoQb/GPVnaHj9qXYG0SY9K3erMtto48bMFpAcscjZHzZQ==, tarball: https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.12.0.tgz} 1917 + peerDependencies: 1918 + '@tiptap/core': ^2.7.0 1919 + dependencies: 1920 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1921 + dev: false 1922 + 1923 + /@tiptap/extension-bubble-menu@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 1924 + resolution: {integrity: sha512-DYijoE0igV0Oi+ZppFsp2UrQsM/4HZtmmpD78BJM9zfCbd1YvAUIxmzmXr8uqU18OHd1uQy+/zvuNoUNYyw67g==, tarball: https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.12.0.tgz} 1925 + peerDependencies: 1926 + '@tiptap/core': ^2.7.0 1927 + '@tiptap/pm': ^2.7.0 1928 + dependencies: 1929 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1930 + '@tiptap/pm': 2.12.0 1931 + tippy.js: 6.3.7 1932 + dev: false 1933 + 1934 + /@tiptap/extension-bullet-list@2.12.0(@tiptap/core@2.12.0): 1935 + resolution: {integrity: sha512-YTCjztB8MaIpwyxFYr81H4+LdKCq1VlaSXQyrPdB44mVdhhRqc46BYQb8/B//XE3UIu3X2QWFjwrqRlUq6vUiw==, tarball: https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.12.0.tgz} 1936 + peerDependencies: 1937 + '@tiptap/core': ^2.7.0 1938 + dependencies: 1939 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1940 + dev: false 1941 + 1942 + /@tiptap/extension-code-block-lowlight@2.12.0(@tiptap/core@2.12.0)(@tiptap/extension-code-block@2.12.0)(@tiptap/pm@2.12.0)(highlight.js@11.11.1)(lowlight@3.3.0): 1943 + resolution: {integrity: sha512-q5dg3GbWCMT0xniVuxjDwAd3CdMfGXFmptulzgaV31HLU+6nu4zZ5sNtMLDA7RU05lnvatKLeXNUhJ2gPouhtw==, tarball: https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.12.0.tgz} 1944 + peerDependencies: 1945 + '@tiptap/core': ^2.7.0 1946 + '@tiptap/extension-code-block': ^2.7.0 1947 + '@tiptap/pm': ^2.7.0 1948 + highlight.js: ^11 1949 + lowlight: ^2 || ^3 1950 + dependencies: 1951 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1952 + '@tiptap/extension-code-block': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 1953 + '@tiptap/pm': 2.12.0 1954 + highlight.js: 11.11.1 1955 + lowlight: 3.3.0 1956 + dev: false 1957 + 1958 + /@tiptap/extension-code-block@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 1959 + resolution: {integrity: sha512-1D7cYAjgxEFHdfC/35Ooi4GqWKB5sszbW8iI7N16XILNln26xb0d5KflXqYrwr9CN/ZnZoCl2o6YsP7xEObcZA==, tarball: https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.12.0.tgz} 1960 + peerDependencies: 1961 + '@tiptap/core': ^2.7.0 1962 + '@tiptap/pm': ^2.7.0 1963 + dependencies: 1964 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1965 + '@tiptap/pm': 2.12.0 1966 + dev: false 1967 + 1968 + /@tiptap/extension-code@2.12.0(@tiptap/core@2.12.0): 1969 + resolution: {integrity: sha512-R7RaS+hJeHFim7alImQ9L9CSWSMjWXvz0Ote568x9ea5gdBGUYW8PcH+5a91lh8e1XGYWBM12a8oJZRyxg/tQA==, tarball: https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.12.0.tgz} 1970 + peerDependencies: 1971 + '@tiptap/core': ^2.7.0 1972 + dependencies: 1973 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1974 + dev: false 1975 + 1976 + /@tiptap/extension-document@2.12.0(@tiptap/core@2.12.0): 1977 + resolution: {integrity: sha512-sA1Q+mxDIv0Y3qQTBkYGwknNbDcGFiJ/fyAFholXpqbrcRx3GavwR/o0chBdsJZlFht0x7AWGwUYWvIo7wYilA==, tarball: https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.12.0.tgz} 1978 + peerDependencies: 1979 + '@tiptap/core': ^2.7.0 1980 + dependencies: 1981 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1982 + dev: false 1983 + 1984 + /@tiptap/extension-dropcursor@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 1985 + resolution: {integrity: sha512-zcZSOXFj+7LVnmdPWTfKr5AoxYIzFPFlLJe35AdTQC5IhkljLn1Exct8I30ZREojX/00hKYsO7JJmePS6TEVlQ==, tarball: https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.12.0.tgz} 1986 + peerDependencies: 1987 + '@tiptap/core': ^2.7.0 1988 + '@tiptap/pm': ^2.7.0 1989 + dependencies: 1990 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 1991 + '@tiptap/pm': 2.12.0 1992 + dev: false 1993 + 1994 + /@tiptap/extension-gapcursor@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 1995 + resolution: {integrity: sha512-k8ji5v9YKn7bNjo8UtI9hEfXfl4tKUp1hpJOEmUxGJQa3LIwrwSbReupUTnHszGQelzxikS/l1xO9P0TIGwRoA==, tarball: https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.12.0.tgz} 1996 + peerDependencies: 1997 + '@tiptap/core': ^2.7.0 1998 + '@tiptap/pm': ^2.7.0 1999 + dependencies: 2000 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2001 + '@tiptap/pm': 2.12.0 2002 + dev: false 2003 + 2004 + /@tiptap/extension-hard-break@2.12.0(@tiptap/core@2.12.0): 2005 + resolution: {integrity: sha512-08MNS2PK5DzdnAfqXn4krmJ/xebKmWpRpYqqN5EM8AvetYKlAJyTVSpo0ZUeGbZ3EZiPm9djgSnrLqpFUDjRCg==, tarball: https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.12.0.tgz} 2006 + peerDependencies: 2007 + '@tiptap/core': ^2.7.0 2008 + dependencies: 2009 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2010 + dev: false 2011 + 2012 + /@tiptap/extension-heading@2.12.0(@tiptap/core@2.12.0): 2013 + resolution: {integrity: sha512-9DfES4Wd5TX1foI70N9sAL+35NN1UHrtzDYN2+dTHupnmKir9RaMXyZcbkUb4aDVzYrGxIqxJzHBVkquKIlTrw==, tarball: https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.12.0.tgz} 2014 + peerDependencies: 2015 + '@tiptap/core': ^2.7.0 2016 + dependencies: 2017 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2018 + dev: false 2019 + 2020 + /@tiptap/extension-history@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 2021 + resolution: {integrity: sha512-+B9CAf2BFURC6mQiM1OQtahVTzdEOEgT/UUNlRZkeeBc0K5of3dr6UdBqaoaMAefja3jx5PqiQ7mhUBAjSt6AA==, tarball: https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.12.0.tgz} 2022 + peerDependencies: 2023 + '@tiptap/core': ^2.7.0 2024 + '@tiptap/pm': ^2.7.0 2025 + dependencies: 2026 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2027 + '@tiptap/pm': 2.12.0 2028 + dev: false 2029 + 2030 + /@tiptap/extension-horizontal-rule@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 2031 + resolution: {integrity: sha512-Vi2+6RIehDSpoJn/7PDuOieUj7W7WrEb4wBxK9TG8PDscihR0mehhhzm/K2xhH4TN48iPJGRsjDFrFjTbXmcnw==, tarball: https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.12.0.tgz} 2032 + peerDependencies: 2033 + '@tiptap/core': ^2.7.0 2034 + '@tiptap/pm': ^2.7.0 2035 + dependencies: 2036 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2037 + '@tiptap/pm': 2.12.0 2038 + dev: false 2039 + 2040 + /@tiptap/extension-image@2.12.0(@tiptap/core@2.12.0): 2041 + resolution: {integrity: sha512-wO+yrfMlnW3SYCb1Q1qAb+nt5WH6jnlQPTV6qdoIabRtW0puwMWULZDUgclPN5hxn8EXb9vBEu44egvH6hgkfQ==, tarball: https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.12.0.tgz} 2042 + peerDependencies: 2043 + '@tiptap/core': ^2.7.0 2044 + dependencies: 2045 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2046 + dev: false 2047 + 2048 + /@tiptap/extension-italic@2.12.0(@tiptap/core@2.12.0): 2049 + resolution: {integrity: sha512-JKcXK3LmEsmxNzEq5e06rPUGMRLUxmJ2mYtBY4NlJ6yLM9XMDljtgeTnWT0ySLYmfINSFTkX4S7WIRbpl9l4pw==, tarball: https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.12.0.tgz} 2050 + peerDependencies: 2051 + '@tiptap/core': ^2.7.0 2052 + dependencies: 2053 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2054 + dev: false 2055 + 2056 + /@tiptap/extension-link@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 2057 + resolution: {integrity: sha512-N6f78F2onvcL8FAwFOJexOF02UwGETLjQ7cCguhBe/w7vtx7aX8/f+IlaSGY/pIcWyEQpoC28ciM0+QsrJRr1A==, tarball: https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.12.0.tgz} 2058 + peerDependencies: 2059 + '@tiptap/core': ^2.7.0 2060 + '@tiptap/pm': ^2.7.0 2061 + dependencies: 2062 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2063 + '@tiptap/pm': 2.12.0 2064 + linkifyjs: 4.3.1 2065 + dev: false 2066 + 2067 + /@tiptap/extension-list-item@2.12.0(@tiptap/core@2.12.0): 2068 + resolution: {integrity: sha512-4YwZooC8HP+gPxs6YrkB1ayggyYbgVvJx/rWBT6lKSW2MVVg8QXi1zAcSI3MhIhHmqDysXXFPL8JURlbeGjaFA==, tarball: https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.12.0.tgz} 2069 + peerDependencies: 2070 + '@tiptap/core': ^2.7.0 2071 + dependencies: 2072 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2073 + dev: false 2074 + 2075 + /@tiptap/extension-ordered-list@2.12.0(@tiptap/core@2.12.0): 2076 + resolution: {integrity: sha512-1ys0e/oqk09oXxrB1WzAx5EntK/QreObG/V1yhgihGm429fxHMsxzIYN6dKAYxx0YOPQG7qEZRrrPuWU70Ms7g==, tarball: https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.12.0.tgz} 2077 + peerDependencies: 2078 + '@tiptap/core': ^2.7.0 2079 + dependencies: 2080 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2081 + dev: false 2082 + 2083 + /@tiptap/extension-paragraph@2.12.0(@tiptap/core@2.12.0): 2084 + resolution: {integrity: sha512-QNK5cgewCunWFxpLlbvvoO1rrLgEtNKxiY79fctP9toV+e59R+1i1Q9lXC1O5mOfDgVxCb6uFDMsqmKhFjpPog==, tarball: https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.12.0.tgz} 2085 + peerDependencies: 2086 + '@tiptap/core': ^2.7.0 2087 + dependencies: 2088 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2089 + dev: false 2090 + 2091 + /@tiptap/extension-placeholder@2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0): 2092 + resolution: {integrity: sha512-K7irDox4P+NLAMjVrJeG72f0sulsCRYpx1Cy4gxKCdi1LTivj5VkXa6MXmi42KTCwBu3pWajBctYIOAES1FTAA==, tarball: https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.12.0.tgz} 2093 + peerDependencies: 2094 + '@tiptap/core': ^2.7.0 2095 + '@tiptap/pm': ^2.7.0 2096 + dependencies: 2097 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2098 + '@tiptap/pm': 2.12.0 2099 + dev: false 2100 + 2101 + /@tiptap/extension-strike@2.12.0(@tiptap/core@2.12.0): 2102 + resolution: {integrity: sha512-nBaa5YtBsLJPZFfSs36sBz4Zgi/c8b3MsmS/Az8uXaHb0R9yPewOVUMDIQbxMct8SXUlIo9VtKlOL+mVJ3Nkpw==, tarball: https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.12.0.tgz} 2103 + peerDependencies: 2104 + '@tiptap/core': ^2.7.0 2105 + dependencies: 2106 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2107 + dev: false 2108 + 2109 + /@tiptap/extension-text-style@2.12.0(@tiptap/core@2.12.0): 2110 + resolution: {integrity: sha512-Pxwt23ZlvbQUahV0PvHy8Ej6IAuKR1FvHobUvwP3T8AiY7hob66fWRe7tQbESzSAzm5Vv2xkvyHeU8vekMTezA==, tarball: https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.12.0.tgz} 2111 + peerDependencies: 2112 + '@tiptap/core': ^2.7.0 2113 + dependencies: 2114 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2115 + dev: false 2116 + 2117 + /@tiptap/extension-text@2.12.0(@tiptap/core@2.12.0): 2118 + resolution: {integrity: sha512-0ytN9V1tZYTXdiYDQg4FB2SQ56JAJC9r/65snefb9ztl+gZzDrIvih7CflHs1ic9PgyjexfMLeH+VzuMccNyZw==, tarball: https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.12.0.tgz} 2119 + peerDependencies: 2120 + '@tiptap/core': ^2.7.0 2121 + dependencies: 2122 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2123 + dev: false 2124 + 2125 + /@tiptap/extension-underline@2.12.0(@tiptap/core@2.12.0): 2126 + resolution: {integrity: sha512-u95lrUCesw1SN3BXY4xrgfSuxtoCYmJ9uaU7IVVOu0zVsDFtLlOa82kd63KVF+URL0kMdO+FBmvdS6d8Era70Q==, tarball: https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.12.0.tgz} 2127 + peerDependencies: 2128 + '@tiptap/core': ^2.7.0 2129 + dependencies: 2130 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2131 + dev: false 2132 + 2133 + /@tiptap/pm@2.12.0: 2134 + resolution: {integrity: sha512-TNzVwpeNzFfHAcYTOKqX9iU4fRxliyoZrCnERR+RRzeg7gWrXrCLubQt1WEx0sojMAfznshSL3M5HGsYjEbYwA==, tarball: https://registry.npmjs.org/@tiptap/pm/-/pm-2.12.0.tgz} 2135 + dependencies: 2136 + prosemirror-changeset: 2.3.0 2137 + prosemirror-collab: 1.3.1 2138 + prosemirror-commands: 1.7.1 2139 + prosemirror-dropcursor: 1.8.2 2140 + prosemirror-gapcursor: 1.3.2 2141 + prosemirror-history: 1.4.1 2142 + prosemirror-inputrules: 1.5.0 2143 + prosemirror-keymap: 1.2.3 2144 + prosemirror-markdown: 1.13.2 2145 + prosemirror-menu: 1.2.5 2146 + prosemirror-model: 1.25.1 2147 + prosemirror-schema-basic: 1.2.4 2148 + prosemirror-schema-list: 1.5.1 2149 + prosemirror-state: 1.4.3 2150 + prosemirror-tables: 1.7.1 2151 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.2) 2152 + prosemirror-transform: 1.10.4 2153 + prosemirror-view: 1.39.2 2154 + dev: false 2155 + 2156 + /@tiptap/starter-kit@2.12.0: 2157 + resolution: {integrity: sha512-wlcEEtexd6u0gbR311/OFZnbtRWU97DUsY6/GsSQzN4rqZ7Ra6YbfHEN5Lutu+I/anomK8vKy8k9NyvfY5Hllg==, tarball: https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.12.0.tgz} 2158 + dependencies: 2159 + '@tiptap/core': 2.12.0(@tiptap/pm@2.12.0) 2160 + '@tiptap/extension-blockquote': 2.12.0(@tiptap/core@2.12.0) 2161 + '@tiptap/extension-bold': 2.12.0(@tiptap/core@2.12.0) 2162 + '@tiptap/extension-bullet-list': 2.12.0(@tiptap/core@2.12.0) 2163 + '@tiptap/extension-code': 2.12.0(@tiptap/core@2.12.0) 2164 + '@tiptap/extension-code-block': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 2165 + '@tiptap/extension-document': 2.12.0(@tiptap/core@2.12.0) 2166 + '@tiptap/extension-dropcursor': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 2167 + '@tiptap/extension-gapcursor': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 2168 + '@tiptap/extension-hard-break': 2.12.0(@tiptap/core@2.12.0) 2169 + '@tiptap/extension-heading': 2.12.0(@tiptap/core@2.12.0) 2170 + '@tiptap/extension-history': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 2171 + '@tiptap/extension-horizontal-rule': 2.12.0(@tiptap/core@2.12.0)(@tiptap/pm@2.12.0) 2172 + '@tiptap/extension-italic': 2.12.0(@tiptap/core@2.12.0) 2173 + '@tiptap/extension-list-item': 2.12.0(@tiptap/core@2.12.0) 2174 + '@tiptap/extension-ordered-list': 2.12.0(@tiptap/core@2.12.0) 2175 + '@tiptap/extension-paragraph': 2.12.0(@tiptap/core@2.12.0) 2176 + '@tiptap/extension-strike': 2.12.0(@tiptap/core@2.12.0) 2177 + '@tiptap/extension-text': 2.12.0(@tiptap/core@2.12.0) 2178 + '@tiptap/extension-text-style': 2.12.0(@tiptap/core@2.12.0) 2179 + '@tiptap/pm': 2.12.0 2180 + dev: false 2181 + 1764 2182 /@tweenjs/tween.js@23.1.3: 1765 2183 resolution: {integrity: sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==, tarball: https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz} 1766 2184 dev: false ··· 1775 2193 /@types/estree@1.0.7: 1776 2194 resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 1777 2195 2196 + /@types/hast@3.0.4: 2197 + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, tarball: https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz} 2198 + dependencies: 2199 + '@types/unist': 2.0.11 2200 + dev: false 2201 + 1778 2202 /@types/json-schema@7.0.15: 1779 2203 resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 1780 2204 dev: true 2205 + 2206 + /@types/linkify-it@5.0.0: 2207 + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==, tarball: https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz} 2208 + dev: false 2209 + 2210 + /@types/markdown-it@14.1.2: 2211 + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==, tarball: https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz} 2212 + dependencies: 2213 + '@types/linkify-it': 5.0.0 2214 + '@types/mdurl': 2.0.0 2215 + dev: false 1781 2216 1782 2217 /@types/mdast@4.0.4: 1783 2218 resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, tarball: https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz} 1784 2219 dependencies: 1785 2220 '@types/unist': 2.0.11 2221 + dev: false 2222 + 2223 + /@types/mdurl@2.0.0: 2224 + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==, tarball: https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz} 1786 2225 dev: false 1787 2226 1788 2227 /@types/node@12.20.55: ··· 1989 2428 1990 2429 /argparse@2.0.1: 1991 2430 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1992 - dev: true 1993 2431 1994 2432 /aria-query@5.3.2: 1995 2433 resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, tarball: https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz} ··· 2161 2599 resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==, tarball: https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz} 2162 2600 dev: false 2163 2601 2602 + /crelt@1.0.6: 2603 + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==, tarball: https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz} 2604 + dev: false 2605 + 2164 2606 /cross-spawn@7.0.6: 2165 2607 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 2166 2608 engines: {node: '>= 8'} ··· 2221 2663 resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 2222 2664 engines: {node: '>=0.10.0'} 2223 2665 2666 + /dequal@2.0.3: 2667 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, tarball: https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz} 2668 + engines: {node: '>=6'} 2669 + dev: false 2670 + 2224 2671 /detect-indent@6.1.0: 2225 2672 resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==, tarball: https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz} 2226 2673 engines: {node: '>=8'} ··· 2233 2680 2234 2681 /devalue@5.1.1: 2235 2682 resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==, tarball: https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz} 2683 + 2684 + /devlop@1.1.0: 2685 + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, tarball: https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz} 2686 + dependencies: 2687 + dequal: 2.0.3 2688 + dev: false 2236 2689 2237 2690 /diet-sprite@0.0.1: 2238 2691 resolution: {integrity: sha512-zSHI2WDAn1wJqJYxcmjWfJv3Iw8oL9reQIbEyx2x2/EZ4/qmUTIo8/5qOCurnAcq61EwtJJaZ0XTy2NRYqpB5A==, tarball: https://registry.npmjs.org/diet-sprite/-/diet-sprite-0.0.1.tgz} ··· 2352 2805 /escape-string-regexp@4.0.0: 2353 2806 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 2354 2807 engines: {node: '>=10'} 2355 - dev: true 2356 2808 2357 2809 /eslint-compat-utils@0.6.5(eslint@9.25.0): 2358 2810 resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==, tarball: https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz} ··· 2686 3138 engines: {node: '>=8'} 2687 3139 dev: true 2688 3140 3141 + /highlight.js@11.11.1: 3142 + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==, tarball: https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz} 3143 + engines: {node: '>=12.0.0'} 3144 + dev: false 3145 + 2689 3146 /hls.js@1.6.2: 2690 3147 resolution: {integrity: sha512-rx+pETSCJEDThm/JCm8CuadcAC410cVjb1XVXFNDKFuylaayHk1+tFxhkjvnMDAfqsJHxZXDAJ3Uc2d5xQyWlQ==, tarball: https://registry.npmjs.org/hls.js/-/hls.js-1.6.2.tgz} 2691 3148 dev: false ··· 2951 3408 engines: {node: '>=10'} 2952 3409 dev: true 2953 3410 3411 + /linkify-it@5.0.0: 3412 + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, tarball: https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz} 3413 + dependencies: 3414 + uc.micro: 2.1.0 3415 + dev: false 3416 + 3417 + /linkifyjs@4.3.1: 3418 + resolution: {integrity: sha512-DRSlB9DKVW04c4SUdGvKK5FR6be45lTU9M76JnngqPeeGDqPwYc0zdUErtsNVMtxPXgUWV4HbXbnC4sNyBxkYg==, tarball: https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.1.tgz} 3419 + dev: false 3420 + 2954 3421 /loadjs@4.3.0: 2955 3422 resolution: {integrity: sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==, tarball: https://registry.npmjs.org/loadjs/-/loadjs-4.3.0.tgz} 2956 3423 dev: false ··· 2994 3461 tslib: 2.8.1 2995 3462 dev: true 2996 3463 3464 + /lowlight@3.3.0: 3465 + resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==, tarball: https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz} 3466 + dependencies: 3467 + '@types/hast': 3.0.4 3468 + devlop: 1.1.0 3469 + highlight.js: 11.11.1 3470 + dev: false 3471 + 2997 3472 /maath@0.10.8(@types/three@0.176.0)(three@0.176.0): 2998 3473 resolution: {integrity: sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==, tarball: https://registry.npmjs.org/maath/-/maath-0.10.8.tgz} 2999 3474 peerDependencies: ··· 3009 3484 dependencies: 3010 3485 '@jridgewell/sourcemap-codec': 1.5.0 3011 3486 3487 + /markdown-it@14.1.0: 3488 + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, tarball: https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz} 3489 + hasBin: true 3490 + dependencies: 3491 + argparse: 2.0.1 3492 + entities: 4.5.0 3493 + linkify-it: 5.0.0 3494 + mdurl: 2.0.0 3495 + punycode.js: 2.3.1 3496 + uc.micro: 2.1.0 3497 + dev: false 3498 + 3012 3499 /mdsvex@0.12.5(svelte@5.28.1): 3013 3500 resolution: {integrity: sha512-JQy8CBbGF1IvpxZTmGJigRiD1s2BKfLKS9xCLPKngjHToY8WMYLZ8WFGRpuR6x4C4bxipSuLm2LctwL2fVXaEQ==, tarball: https://registry.npmjs.org/mdsvex/-/mdsvex-0.12.5.tgz} 3014 3501 peerDependencies: ··· 3021 3508 svelte: 5.28.1 3022 3509 unist-util-visit: 2.0.3 3023 3510 vfile-message: 2.0.4 3511 + dev: false 3512 + 3513 + /mdurl@2.0.0: 3514 + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, tarball: https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz} 3024 3515 dev: false 3025 3516 3026 3517 /merge2@1.4.1: ··· 3127 3618 type-check: 0.4.0 3128 3619 word-wrap: 1.2.5 3129 3620 dev: true 3621 + 3622 + /orderedmap@2.1.1: 3623 + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==, tarball: https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz} 3624 + dev: false 3130 3625 3131 3626 /os-tmpdir@1.0.2: 3132 3627 resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, tarball: https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz} ··· 3416 3911 engines: {node: '>=6'} 3417 3912 dev: false 3418 3913 3914 + /prosemirror-changeset@2.3.0: 3915 + resolution: {integrity: sha512-8wRKhlEwEJ4I13Ju54q2NZR1pVKGTgJ/8XsQ8L5A5uUsQ/YQScQJuEAuh8Bn8i6IwAMjjLRABd9lVli+DlIiVw==, tarball: https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.0.tgz} 3916 + dependencies: 3917 + prosemirror-transform: 1.10.4 3918 + dev: false 3919 + 3920 + /prosemirror-collab@1.3.1: 3921 + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==, tarball: https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz} 3922 + dependencies: 3923 + prosemirror-state: 1.4.3 3924 + dev: false 3925 + 3926 + /prosemirror-commands@1.7.1: 3927 + resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==, tarball: https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz} 3928 + dependencies: 3929 + prosemirror-model: 1.25.1 3930 + prosemirror-state: 1.4.3 3931 + prosemirror-transform: 1.10.4 3932 + dev: false 3933 + 3934 + /prosemirror-dropcursor@1.8.2: 3935 + resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==, tarball: https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz} 3936 + dependencies: 3937 + prosemirror-state: 1.4.3 3938 + prosemirror-transform: 1.10.4 3939 + prosemirror-view: 1.39.2 3940 + dev: false 3941 + 3942 + /prosemirror-gapcursor@1.3.2: 3943 + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==, tarball: https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz} 3944 + dependencies: 3945 + prosemirror-keymap: 1.2.3 3946 + prosemirror-model: 1.25.1 3947 + prosemirror-state: 1.4.3 3948 + prosemirror-view: 1.39.2 3949 + dev: false 3950 + 3951 + /prosemirror-history@1.4.1: 3952 + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==, tarball: https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz} 3953 + dependencies: 3954 + prosemirror-state: 1.4.3 3955 + prosemirror-transform: 1.10.4 3956 + prosemirror-view: 1.39.2 3957 + rope-sequence: 1.3.4 3958 + dev: false 3959 + 3960 + /prosemirror-inputrules@1.5.0: 3961 + resolution: {integrity: sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==, tarball: https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz} 3962 + dependencies: 3963 + prosemirror-state: 1.4.3 3964 + prosemirror-transform: 1.10.4 3965 + dev: false 3966 + 3967 + /prosemirror-keymap@1.2.3: 3968 + resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==, tarball: https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz} 3969 + dependencies: 3970 + prosemirror-state: 1.4.3 3971 + w3c-keyname: 2.2.8 3972 + dev: false 3973 + 3974 + /prosemirror-markdown@1.13.2: 3975 + resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==, tarball: https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz} 3976 + dependencies: 3977 + '@types/markdown-it': 14.1.2 3978 + markdown-it: 14.1.0 3979 + prosemirror-model: 1.25.1 3980 + dev: false 3981 + 3982 + /prosemirror-menu@1.2.5: 3983 + resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==, tarball: https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz} 3984 + dependencies: 3985 + crelt: 1.0.6 3986 + prosemirror-commands: 1.7.1 3987 + prosemirror-history: 1.4.1 3988 + prosemirror-state: 1.4.3 3989 + dev: false 3990 + 3991 + /prosemirror-model@1.25.1: 3992 + resolution: {integrity: sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg==, tarball: https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz} 3993 + dependencies: 3994 + orderedmap: 2.1.1 3995 + dev: false 3996 + 3997 + /prosemirror-schema-basic@1.2.4: 3998 + resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==, tarball: https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz} 3999 + dependencies: 4000 + prosemirror-model: 1.25.1 4001 + dev: false 4002 + 4003 + /prosemirror-schema-list@1.5.1: 4004 + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==, tarball: https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz} 4005 + dependencies: 4006 + prosemirror-model: 1.25.1 4007 + prosemirror-state: 1.4.3 4008 + prosemirror-transform: 1.10.4 4009 + dev: false 4010 + 4011 + /prosemirror-state@1.4.3: 4012 + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==, tarball: https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz} 4013 + dependencies: 4014 + prosemirror-model: 1.25.1 4015 + prosemirror-transform: 1.10.4 4016 + prosemirror-view: 1.39.2 4017 + dev: false 4018 + 4019 + /prosemirror-tables@1.7.1: 4020 + resolution: {integrity: sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==, tarball: https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz} 4021 + dependencies: 4022 + prosemirror-keymap: 1.2.3 4023 + prosemirror-model: 1.25.1 4024 + prosemirror-state: 1.4.3 4025 + prosemirror-transform: 1.10.4 4026 + prosemirror-view: 1.39.2 4027 + dev: false 4028 + 4029 + /prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.39.2): 4030 + resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==, tarball: https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz} 4031 + peerDependencies: 4032 + prosemirror-model: ^1.22.1 4033 + prosemirror-state: ^1.4.2 4034 + prosemirror-view: ^1.33.8 4035 + dependencies: 4036 + '@remirror/core-constants': 3.0.0 4037 + escape-string-regexp: 4.0.0 4038 + prosemirror-model: 1.25.1 4039 + prosemirror-state: 1.4.3 4040 + prosemirror-view: 1.39.2 4041 + dev: false 4042 + 4043 + /prosemirror-transform@1.10.4: 4044 + resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==, tarball: https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz} 4045 + dependencies: 4046 + prosemirror-model: 1.25.1 4047 + dev: false 4048 + 4049 + /prosemirror-view@1.39.2: 4050 + resolution: {integrity: sha512-BmOkml0QWNob165gyUxXi5K5CVUgVPpqMEAAml/qzgKn9boLUWVPzQ6LtzXw8Cn1GtRQX4ELumPxqtLTDaAKtg==, tarball: https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.2.tgz} 4051 + dependencies: 4052 + prosemirror-model: 1.25.1 4053 + prosemirror-state: 1.4.3 4054 + prosemirror-transform: 1.10.4 4055 + dev: false 4056 + 4057 + /punycode.js@2.3.1: 4058 + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, tarball: https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz} 4059 + engines: {node: '>=6'} 4060 + dev: false 4061 + 3419 4062 /punycode@2.3.1: 3420 4063 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 3421 4064 engines: {node: '>=6'} ··· 3495 4138 '@rollup/rollup-win32-ia32-msvc': 4.40.0 3496 4139 '@rollup/rollup-win32-x64-msvc': 4.40.0 3497 4140 fsevents: 2.3.3 4141 + 4142 + /rope-sequence@1.3.4: 4143 + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==, tarball: https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz} 4144 + dev: false 3498 4145 3499 4146 /run-parallel@1.2.0: 3500 4147 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} ··· 3770 4417 fdir: 6.4.4(picomatch@4.0.2) 3771 4418 picomatch: 4.0.2 3772 4419 4420 + /tippy.js@6.3.7: 4421 + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==, tarball: https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz} 4422 + dependencies: 4423 + '@popperjs/core': 2.11.8 4424 + dev: false 4425 + 3773 4426 /tlds@1.258.0: 3774 4427 resolution: {integrity: sha512-XGhStWuOlBA5D8QnyN2xtgB2cUOdJ3ztisne1DYVWMcVH29qh8eQIpRmP3HnuJLdgyzG0HpdGzRMu1lm/Oictw==, tarball: https://registry.npmjs.org/tlds/-/tlds-1.258.0.tgz} 3775 4428 hasBin: true ··· 3919 4572 engines: {node: '>=14.17'} 3920 4573 dev: true 3921 4574 4575 + /uc.micro@2.1.0: 4576 + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, tarball: https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz} 4577 + dev: false 4578 + 3922 4579 /uint8arrays@3.0.0: 3923 4580 resolution: {integrity: sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==, tarball: https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz} 3924 4581 dependencies: ··· 4050 4707 optional: true 4051 4708 dependencies: 4052 4709 vite: 6.3.2 4710 + 4711 + /w3c-keyname@2.2.8: 4712 + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==, tarball: https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz} 4713 + dev: false 4053 4714 4054 4715 /webgl-sdf-generator@1.1.1: 4055 4716 resolution: {integrity: sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==, tarball: https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz}
+7
.changeset/three-deer-sort.md
··· 1 + --- 2 + '@fuxui/colors': patch 3 + '@fuxui/base': patch 4 + '@fuxui/text': patch 5 + --- 6 + 7 + bump
+1
apps/docs/package.json
··· 21 21 "@fuxui/colors": "workspace:*", 22 22 "@fuxui/social": "workspace:*", 23 23 "@fuxui/time": "workspace:*", 24 + "@fuxui/text": "workspace:*", 24 25 "@fuxui/visual": "workspace:*", 25 26 "@sveltejs/adapter-auto": "^6.0.0", 26 27 "@sveltejs/kit": "^2.16.0",
+23
packages/text/.gitignore
··· 1 + node_modules 2 + 3 + # Output 4 + .output 5 + .vercel 6 + .netlify 7 + .wrangler 8 + /.svelte-kit 9 + /build 10 + 11 + # OS 12 + .DS_Store 13 + Thumbs.db 14 + 15 + # Env 16 + .env 17 + .env.* 18 + !.env.example 19 + !.env.test 20 + 21 + # Vite 22 + vite.config.js.timestamp-* 23 + vite.config.ts.timestamp-*
+1
packages/text/.npmrc
··· 1 + engine-strict=true
+6
packages/text/.prettierignore
··· 1 + # Package Managers 2 + package-lock.json 3 + pnpm-lock.yaml 4 + yarn.lock 5 + bun.lock 6 + bun.lockb
+15
packages/text/.prettierrc
··· 1 + { 2 + "useTabs": true, 3 + "singleQuote": true, 4 + "trailingComma": "none", 5 + "printWidth": 100, 6 + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], 7 + "overrides": [ 8 + { 9 + "files": "*.svelte", 10 + "options": { 11 + "parser": "svelte" 12 + } 13 + } 14 + ] 15 + }
+53
packages/text/CHANGELOG.md
··· 1 + # @fuxui/time 2 + 3 + ## 0.0.9 4 + 5 + ### Patch Changes 6 + 7 + - Updated dependencies [9324633] 8 + - @fuxui/base@0.0.9 9 + 10 + ## 0.0.8 11 + 12 + ### Patch Changes 13 + 14 + - Updated dependencies [28e715d] 15 + - @fuxui/base@0.0.8 16 + 17 + ## 0.0.7 18 + 19 + ### Patch Changes 20 + 21 + - Updated dependencies [102c3a5] 22 + - @fuxui/base@0.0.7 23 + 24 + ## 0.0.6 25 + 26 + ### Patch Changes 27 + 28 + - Updated dependencies [0ff724f] 29 + - @fuxui/base@0.0.6 30 + 31 + ## 0.0.5 32 + 33 + ### Patch Changes 34 + 35 + - 741c208: bump 36 + - Updated dependencies [741c208] 37 + - @fuxui/base@0.0.5 38 + 39 + ## 0.0.4 40 + 41 + ### Patch Changes 42 + 43 + - ab8e993: bump 44 + - Updated dependencies [ab8e993] 45 + - @fuxui/base@0.0.4 46 + 47 + ## 0.0.3 48 + 49 + ### Patch Changes 50 + 51 + - 438c20c: add package override script 52 + - Updated dependencies [438c20c] 53 + - @fuxui/base@0.0.3
+80
packages/text/README.md
··· 1 + # 🦊 fox ui 2 + 3 + > **This is a public alpha release. Expect bugs and breaking changes.** 4 + 5 + svelte v5 + tailwind v4 6 + 7 + [See all components here](https://flo-bit.dev/ui-kit) 8 + 9 + Read more about [the philosophy/aim of this project here](https://flo-bit.dev/ui-kit/docs/philosophy). 10 + 11 + ## Quickstart 12 + 13 + ### 1. Create a new svelte project with tailwind css (including `@tailwindcss/typography` and `@tailwindcss/forms` plugins) 14 + 15 + ```bash 16 + npx sv create my-project 17 + ``` 18 + 19 + ### 2. Install fuchs-ui 20 + 21 + ```bash 22 + npm install @fuxui/base 23 + ``` 24 + 25 + ### 3. set theme variables in your app.css (changing `zinc` and `emerald` to your preferred colors, using find and replace). 26 + 27 + ```css 28 + @source "../node_modules/@fuxui"; 29 + 30 + @theme { 31 + --color-base-50: var(--color-zinc-50); 32 + --color-base-100: var(--color-zinc-100); 33 + --color-base-200: var(--color-zinc-200); 34 + --color-base-300: var(--color-zinc-300); 35 + --color-base-400: var(--color-zinc-400); 36 + --color-base-500: var(--color-zinc-500); 37 + --color-base-600: var(--color-zinc-600); 38 + --color-base-700: var(--color-zinc-700); 39 + --color-base-800: var(--color-zinc-800); 40 + --color-base-900: var(--color-zinc-900); 41 + --color-base-950: var(--color-zinc-950); 42 + 43 + --color-accent-50: var(--color-emerald-50); 44 + --color-accent-100: var(--color-emerald-100); 45 + --color-accent-200: var(--color-emerald-200); 46 + --color-accent-300: var(--color-emerald-300); 47 + --color-accent-400: var(--color-emerald-400); 48 + --color-accent-500: var(--color-emerald-500); 49 + --color-accent-600: var(--color-emerald-600); 50 + --color-accent-700: var(--color-emerald-700); 51 + --color-accent-800: var(--color-emerald-800); 52 + --color-accent-900: var(--color-emerald-900); 53 + --color-accent-950: var(--color-emerald-950); 54 + } 55 + ``` 56 + 57 + ### 4. Use the components 58 + 59 + ```svelte 60 + <script> 61 + import { Button } from '@fuxui/base'; 62 + </script> 63 + 64 + <Button onclick={() => alert('clicked')}>Click me</Button> 65 + ``` 66 + 67 + ## Development 68 + 69 + If you want to contribute to the project, please open an issue first describing the feature you want to add. 70 + 71 + Clone the repo, install dependencies and run the dev server 72 + 73 + ```bash 74 + git clone https://github.com/flo-bit/ui-kit.git 75 + cd ui-kit 76 + pnpm install 77 + pnpm run dev 78 + ``` 79 + 80 + The ui-kit library is located in `packages/` (`packages/base` for the base package), the documentation is in `apps/docs`.
+36
packages/text/eslint.config.js
··· 1 + import prettier from 'eslint-config-prettier'; 2 + import js from '@eslint/js'; 3 + import { includeIgnoreFile } from '@eslint/compat'; 4 + import svelte from 'eslint-plugin-svelte'; 5 + import globals from 'globals'; 6 + import { fileURLToPath } from 'node:url'; 7 + import ts from 'typescript-eslint'; 8 + import svelteConfig from './svelte.config.js'; 9 + 10 + const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); 11 + 12 + export default ts.config( 13 + includeIgnoreFile(gitignorePath), 14 + js.configs.recommended, 15 + ...ts.configs.recommended, 16 + ...svelte.configs.recommended, 17 + prettier, 18 + ...svelte.configs.prettier, 19 + { 20 + languageOptions: { 21 + globals: { ...globals.browser, ...globals.node } 22 + }, 23 + rules: { 'no-undef': 'off' } 24 + }, 25 + { 26 + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], 27 + languageOptions: { 28 + parserOptions: { 29 + projectService: true, 30 + extraFileExtensions: ['.svelte'], 31 + parser: ts.parser, 32 + svelteConfig 33 + } 34 + } 35 + } 36 + );
+93
packages/text/package.json
··· 1 + { 2 + "name": "@fuxui/text", 3 + "private": false, 4 + "version": "0.0.9", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite dev", 8 + "build": "vite build && npm run prepack", 9 + "build:package": "vite build && npm run prepack", 10 + "preview": "vite preview", 11 + "prepare": "svelte-kit sync || echo ''", 12 + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 13 + "prepack": "svelte-kit sync && svelte-package && node ./scripts/cleanup.js", 14 + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 15 + "format": "prettier --write .", 16 + "lint": "prettier --check . && eslint ." 17 + }, 18 + "files": [ 19 + "dist" 20 + ], 21 + "sideEffects": [ 22 + "**/*.css" 23 + ], 24 + "exports": { 25 + ".": { 26 + "types": "./src/lib/types.d.ts", 27 + "svelte": "./src/lib/index.ts" 28 + } 29 + }, 30 + "types": "./src/lib/types.d.ts", 31 + "svelte": "./src/lib/index.ts", 32 + "publishOverrides": { 33 + "files": [ 34 + "dist" 35 + ], 36 + "svelte": "./dist/index.js", 37 + "exports": { 38 + ".": { 39 + "types": "./dist/types.d.ts", 40 + "svelte": "./dist/index.js" 41 + } 42 + }, 43 + "types": "./dist/types.d.ts" 44 + }, 45 + "devDependencies": { 46 + "@eslint/compat": "^1.2.5", 47 + "@eslint/js": "^9.18.0", 48 + "@sveltejs/adapter-auto": "^6.0.0", 49 + "@sveltejs/adapter-static": "^3.0.8", 50 + "@sveltejs/kit": "^2.16.0", 51 + "@sveltejs/package": "^2.3.11", 52 + "@sveltejs/vite-plugin-svelte": "^5.0.0", 53 + "@tailwindcss/forms": "^0.5.9", 54 + "@tailwindcss/typography": "^0.5.15", 55 + "@tailwindcss/vite": "^4.1.5", 56 + "eslint": "^9.18.0", 57 + "eslint-config-prettier": "^10.0.1", 58 + "eslint-plugin-svelte": "^3.0.0", 59 + "globals": "^16.0.0", 60 + "prettier": "^3.4.2", 61 + "prettier-plugin-svelte": "^3.3.3", 62 + "prettier-plugin-tailwindcss": "^0.6.11", 63 + "svelte": "^5.0.0", 64 + "svelte-check": "^4.0.0", 65 + "tailwindcss": "^4.1.5", 66 + "typescript": "^5.0.0", 67 + "typescript-eslint": "^8.20.0", 68 + "vite": "^6.2.6" 69 + }, 70 + "dependencies": { 71 + "@fuxui/base": "workspace:*", 72 + "@tiptap/core": "^2.12.0", 73 + "@tiptap/extension-bubble-menu": "^2.12.0", 74 + "@tiptap/extension-code-block-lowlight": "^2.12.0", 75 + "@tiptap/extension-document": "^2.12.0", 76 + "@tiptap/extension-dropcursor": "^2.12.0", 77 + "@tiptap/extension-history": "^2.12.0", 78 + "@tiptap/extension-image": "^2.12.0", 79 + "@tiptap/extension-link": "^2.12.0", 80 + "@tiptap/extension-paragraph": "^2.12.0", 81 + "@tiptap/extension-placeholder": "^2.12.0", 82 + "@tiptap/extension-strike": "^2.12.0", 83 + "@tiptap/extension-text": "^2.12.0", 84 + "@tiptap/extension-underline": "^2.12.0", 85 + "@tiptap/starter-kit": "^2.12.0", 86 + "bits-ui": "^1.4.3", 87 + "lowlight": "^3.3.0" 88 + }, 89 + "peerDependencies": { 90 + "svelte": ">=5", 91 + "tailwindcss": ">=3" 92 + } 93 + }
+18
packages/text/svelte.config.js
··· 1 + import adapter from '@sveltejs/adapter-static'; 2 + import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 + 4 + /** @type {import('@sveltejs/kit').Config} */ 5 + const config = { 6 + // Consult https://svelte.dev/docs/kit/integrations 7 + // for more information about preprocessors 8 + preprocess: vitePreprocess(), 9 + 10 + kit: { 11 + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. 12 + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. 13 + // See https://svelte.dev/docs/kit/adapters for more information about adapters. 14 + adapter: adapter() 15 + } 16 + }; 17 + 18 + export default config;
+19
packages/text/tsconfig.json
··· 1 + { 2 + "extends": "./.svelte-kit/tsconfig.json", 3 + "compilerOptions": { 4 + "allowJs": true, 5 + "checkJs": true, 6 + "esModuleInterop": true, 7 + "forceConsistentCasingInFileNames": true, 8 + "resolveJsonModule": true, 9 + "skipLibCheck": true, 10 + "sourceMap": true, 11 + "strict": true, 12 + "moduleResolution": "bundler" 13 + } 14 + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias 15 + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files 16 + // 17 + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 + // from the referenced tsconfig.json - TypeScript does not merge them in 19 + }
+7
packages/text/vite.config.ts
··· 1 + import tailwindcss from '@tailwindcss/vite'; 2 + import { sveltekit } from '@sveltejs/kit/vite'; 3 + import { defineConfig } from 'vite'; 4 + 5 + export default defineConfig({ 6 + plugins: [tailwindcss(), sveltekit()] 7 + });
+26
packages/text/scripts/cleanup.js
··· 1 + import { readFileSync, writeFileSync } from 'fs'; 2 + 3 + /** 4 + * This script utilizes a property called "publishOverrides" in the package.json 5 + * to override specific properties in the package.json when publishing to npm. 6 + */ 7 + const cleanPackage = () => { 8 + let packageJson = JSON.parse( 9 + readFileSync('./package.json', { 10 + encoding: 'utf-8' 11 + }) 12 + ); 13 + 14 + packageJson = { 15 + ...packageJson, 16 + ...packageJson.publishOverrides 17 + }; 18 + 19 + delete packageJson.publishOverrides; 20 + 21 + writeFileSync('./package.json', JSON.stringify(packageJson, null, 2), { 22 + encoding: 'utf-8' 23 + }); 24 + }; 25 + 26 + cleanPackage();
+29
packages/text/src/app.css
··· 1 + @import 'tailwindcss'; 2 + @plugin '@tailwindcss/forms'; 3 + @plugin '@tailwindcss/typography'; 4 + 5 + @theme { 6 + --color-base-50: var(--color-zinc-50); 7 + --color-base-100: var(--color-zinc-100); 8 + --color-base-200: var(--color-zinc-200); 9 + --color-base-300: var(--color-zinc-300); 10 + --color-base-400: var(--color-zinc-400); 11 + --color-base-500: var(--color-zinc-500); 12 + --color-base-600: var(--color-zinc-600); 13 + --color-base-700: var(--color-zinc-700); 14 + --color-base-800: var(--color-zinc-800); 15 + --color-base-900: var(--color-zinc-900); 16 + --color-base-950: var(--color-zinc-950); 17 + 18 + --color-accent-50: var(--color-pink-50); 19 + --color-accent-100: var(--color-pink-100); 20 + --color-accent-200: var(--color-pink-200); 21 + --color-accent-300: var(--color-pink-300); 22 + --color-accent-400: var(--color-pink-400); 23 + --color-accent-500: var(--color-pink-500); 24 + --color-accent-600: var(--color-pink-600); 25 + --color-accent-700: var(--color-pink-700); 26 + --color-accent-800: var(--color-pink-800); 27 + --color-accent-900: var(--color-pink-900); 28 + --color-accent-950: var(--color-pink-950); 29 + }
+13
packages/text/src/app.d.ts
··· 1 + // See https://svelte.dev/docs/kit/types#app.d.ts 2 + // for information about these interfaces 3 + declare global { 4 + namespace App { 5 + // interface Error {} 6 + // interface Locals {} 7 + // interface PageData {} 8 + // interface PageState {} 9 + // interface Platform {} 10 + } 11 + } 12 + 13 + export {};
+11
packages/text/src/app.html
··· 1 + <!doctype html> 2 + <html lang="en"> 3 + <head> 4 + <meta charset="utf-8" /> 5 + <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 + %sveltekit.head% 7 + </head> 8 + <body data-sveltekit-preload-data="hover"> 9 + <div style="display: contents">%sveltekit.body%</div> 10 + </body> 11 + </html>
+1
packages/text/src/lib/index.ts
··· 1 + export * from './components';
+1
packages/text/src/lib/types.d.ts
··· 1 + export * from './index';
+7
packages/text/src/routes/+layout.svelte
··· 1 + <script lang="ts"> 2 + import '../app.css'; 3 + 4 + let { children } = $props(); 5 + </script> 6 + 7 + {@render children()}
+1
packages/text/src/routes/+layout.ts
··· 1 + export const prerender = true;
packages/text/src/routes/+page.svelte
+12 -6
apps/docs/src/lib/site-components/components_all.ts
··· 2 2 import { type ComponentCard, baseComponents } from './components_base'; 3 3 import { colorsComponents } from './components_colors'; 4 4 import { socialComponents } from './components_social'; 5 + import { textComponents } from './components_text'; 5 6 import { timeComponents } from './components_time'; 6 7 import { visualComponents } from './components_visual'; 7 8 ··· 26 27 href: 'social' 27 28 }, 28 29 { 29 - name: '3D', 30 - components: threeDComponents, 31 - href: '3d' 30 + name: 'Text', 31 + components: textComponents, 32 + href: 'text' 33 + }, 34 + { 35 + name: 'Visual', 36 + components: visualComponents, 37 + href: 'visual' 32 38 }, 33 39 { 34 40 name: 'Time', ··· 36 42 href: 'time' 37 43 }, 38 44 { 39 - name: 'Visual', 40 - components: visualComponents, 41 - href: 'visual' 45 + name: '3D', 46 + components: threeDComponents, 47 + href: '3d' 42 48 } 43 49 ];
+12
apps/docs/src/lib/site-components/components_base.ts
··· 25 25 import CardPopover from '$lib/cards/base/CardPopover.svelte'; 26 26 import CardSidebar from '$lib/cards/base/CardSidebar.svelte'; 27 27 import CardTabs from '$lib/cards/base/CardTabs.svelte'; 28 + import CardToggle from '$lib/cards/base/CardToggle.svelte'; 29 + import CardToggleGroup from '$lib/cards/base/CardToggleGroup.svelte'; 28 30 29 31 export type ComponentCard = { 30 32 component: Component; ··· 160 162 component: CardTabs, 161 163 label: 'Tabs', 162 164 href: 'tabs' 165 + }, 166 + { 167 + component: CardToggle, 168 + label: 'Toggle', 169 + href: 'toggle' 170 + }, 171 + { 172 + component: CardToggleGroup, 173 + label: 'Toggle Group', 174 + href: 'toggle-group' 163 175 } 164 176 ].sort((a, b) => a.label.localeCompare(b.label));
+16
apps/docs/src/lib/site-components/components_text.ts
··· 1 + import CardPlainTextEditor from '$lib/cards/text/CardPlainTextEditor.svelte'; 2 + import CardRichTextEditor from '$lib/cards/text/CardRichTextEditor.svelte'; 3 + import type { ComponentCard } from './components_base'; 4 + 5 + export const textComponents: ComponentCard[] = [ 6 + { 7 + component: CardPlainTextEditor, 8 + label: 'Plain Text Editor', 9 + href: 'plain-text-editor' 10 + }, 11 + { 12 + component: CardRichTextEditor, 13 + label: 'Rich Text Editor', 14 + href: 'rich-text-editor' 15 + } 16 + ].sort((a, b) => a.label.localeCompare(b.label));
+2
packages/text/src/lib/components/index.ts
··· 1 + export * from './plain-text-editor/'; 2 + export * from './rich-text-editor/';
+23
apps/docs/src/lib/cards/base/CardToggle.svelte
··· 1 + <script> 2 + import { cn, toggleVariants } from '@fuxui/base'; 3 + </script> 4 + 5 + <div class="flex gap-4"> 6 + <div class={toggleVariants()}> 7 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-6"> 8 + <path 9 + d="m20.798 11.012-3.188 3.416L9.462 6.28l4.24-4.542a.75.75 0 0 1 1.272.71L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262ZM3.202 12.988 6.39 9.572l8.148 8.148-4.24 4.542a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262ZM3.53 2.47a.75.75 0 0 0-1.06 1.06l18 18a.75.75 0 1 0 1.06-1.06l-18-18Z" 10 + /> 11 + </svg> 12 + </div> 13 + 14 + <div class={toggleVariants()} data-state="on"> 15 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-6"> 16 + <path 17 + fill-rule="evenodd" 18 + d="M14.615 1.595a.75.75 0 0 1 .359.852L12.982 9.75h7.268a.75.75 0 0 1 .548 1.262l-10.5 11.25a.75.75 0 0 1-1.272-.71l1.992-7.302H3.75a.75.75 0 0 1-.548-1.262l10.5-11.25a.75.75 0 0 1 .913-.143Z" 19 + clip-rule="evenodd" 20 + /> 21 + </svg> 22 + </div> 23 + </div>
+32
apps/docs/src/lib/cards/base/CardToggleGroup.svelte
··· 1 + <script> 2 + import { cn, toggleVariants } from '@fuxui/base'; 3 + </script> 4 + 5 + <div class="flex gap-2"> 6 + <div class={toggleVariants()} data-state="on"> 7 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 8 + <path fill-rule="evenodd" d="M5.246 3.744a.75.75 0 0 1 .75-.75h7.125a4.875 4.875 0 0 1 3.346 8.422 5.25 5.25 0 0 1-2.97 9.58h-7.5a.75.75 0 0 1-.75-.75V3.744Zm7.125 6.75a2.625 2.625 0 0 0 0-5.25H8.246v5.25h4.125Zm-4.125 2.251v6h4.5a3 3 0 0 0 0-6h-4.5Z" clip-rule="evenodd" /> 9 + </svg> 10 + 11 + </div> 12 + 13 + <div class={toggleVariants()} data-state="on"> 14 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 15 + <path fill-rule="evenodd" d="M10.497 3.744a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-3.275l-5.357 15.002h2.632a.75.75 0 1 1 0 1.5h-7.5a.75.75 0 1 1 0-1.5h3.275l5.357-15.002h-2.632a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd" /> 16 + </svg> 17 + 18 + </div> 19 + <div class={toggleVariants()}> 20 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 21 + <path fill-rule="evenodd" d="M5.995 2.994a.75.75 0 0 1 .75.75v7.5a5.25 5.25 0 1 0 10.5 0v-7.5a.75.75 0 0 1 1.5 0v7.5a6.75 6.75 0 1 1-13.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-3 17.252a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5h-16.5a.75.75 0 0 1-.75-.75Z" clip-rule="evenodd" /> 22 + </svg> 23 + 24 + 25 + </div> 26 + <div class={toggleVariants()}> 27 + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 28 + <path fill-rule="evenodd" d="M9.657 4.728c-1.086.385-1.766 1.057-1.979 1.85-.214.8.046 1.733.81 2.616.746.862 1.93 1.612 3.388 2.003.07.019.14.037.21.053h8.163a.75.75 0 0 1 0 1.5h-8.24a.66.66 0 0 1-.02 0H3.75a.75.75 0 0 1 0-1.5h4.78a7.108 7.108 0 0 1-1.175-1.074C6.372 9.042 5.849 7.61 6.229 6.19c.377-1.408 1.528-2.38 2.927-2.876 1.402-.497 3.127-.55 4.855-.086A8.937 8.937 0 0 1 16.94 4.6a.75.75 0 0 1-.881 1.215 7.437 7.437 0 0 0-2.436-1.14c-1.473-.394-2.885-.331-3.966.052Zm6.533 9.632a.75.75 0 0 1 1.03.25c.592.974.846 2.094.55 3.2-.378 1.408-1.529 2.38-2.927 2.876-1.402.497-3.127.55-4.855.087-1.712-.46-3.168-1.354-4.134-2.47a.75.75 0 0 1 1.134-.982c.746.862 1.93 1.612 3.388 2.003 1.473.394 2.884.331 3.966-.052 1.085-.384 1.766-1.056 1.978-1.85.169-.628.046-1.33-.381-2.032a.75.75 0 0 1 .25-1.03Z" clip-rule="evenodd" /> 29 + </svg> 30 + 31 + </div> 32 + </div>
+22
apps/docs/src/lib/cards/text/CardPlainTextEditor.svelte
··· 1 + <div class="text-base-900 dark:text-base-100 relative h-fit w-fit text-xl font-medium"> 2 + Hello there 3 + 4 + <div 5 + class="bg-accent-600 dark:bg-accent-500 cursor absolute -right-1 bottom-0 top-0 h-full w-[calc(var(--spacing)*0.5)]" 6 + ></div> 7 + </div> 8 + 9 + <style> 10 + @keyframes blink { 11 + 0%, 12 + 100% { 13 + opacity: 0; 14 + } 15 + 50% { 16 + opacity: 1; 17 + } 18 + } 19 + .cursor { 20 + animation: blink 1s step-end infinite; 21 + } 22 + </style>
+34
apps/docs/src/lib/cards/text/CardRichTextEditor.svelte
··· 1 + <script> 2 + import { Prose } from '@fuxui/base'; 3 + </script> 4 + 5 + <div class="w-full"> 6 + <Prose> 7 + <h2>This is a heading</h2> 8 + <h3>And a subheading</h3> 9 + <p class="relative w-fit"> 10 + This is my text, see <span class="text-accent-600 dark:text-accent-400 font-semibold" 11 + >this link</span 12 + > 13 + 14 + <span 15 + class="bg-accent-600 dark:bg-accent-500 cursor absolute -right-1 bottom-0 top-0 h-full w-[calc(var(--spacing)*0.5)]" 16 + ></span> 17 + </p> 18 + </Prose> 19 + </div> 20 + 21 + <style> 22 + @keyframes blink { 23 + 0%, 24 + 100% { 25 + opacity: 0; 26 + } 27 + 50% { 28 + opacity: 1; 29 + } 30 + } 31 + .cursor { 32 + animation: blink 1s step-end infinite; 33 + } 34 + </style>
+5 -5
packages/base/src/lib/components/toggle/toggle.svelte
··· 2 2 import { type VariantProps, tv } from 'tailwind-variants'; 3 3 4 4 export const toggleVariants = tv({ 5 - base: 'hover:bg-base-200/50 dark:hover:bg-base-800/50 dark:hover:text-base-50 hover:text-base-950 data-[state=on]:bg-accent-400/40 dark:data-[state=on]:bg-accent-500/15 dark:data-[state=on]:text-accent-300 data-[state=on]:text-accent-950 inline-flex items-center justify-center gap-2 rounded-2xl text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', 5 + base: 'text-base-900 dark:text-base-100 hover:bg-base-200/50 dark:hover:bg-base-800/50 dark:hover:text-base-50 hover:text-base-950 data-[state=on]:bg-accent-400/40 dark:data-[state=on]:bg-accent-500/15 dark:data-[state=on]:text-accent-300 data-[state=on]:text-accent-950 inline-flex items-center justify-center gap-2 rounded-2xl text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0', 6 6 variants: { 7 7 variant: { 8 - default: '' 8 + default: 'bg-base-200/20 dark:bg-base-800/20' 9 9 }, 10 10 size: { 11 - default: 'h-10 min-w-10 px-3', 12 - sm: 'h-9 min-w-9 px-2.5', 13 - lg: 'h-11 min-w-11 px-5' 11 + default: 'h-10 min-w-10 px-3 [&_svg]:size-4', 12 + sm: 'h-9 min-w-9 px-2.5 [&_svg]:size-3.5', 13 + lg: 'h-11 min-w-11 px-4 [&_svg]:size-5', 14 14 } 15 15 }, 16 16 defaultVariants: {
+7 -1
packages/colors/src/lib/components/select-theme/SelectTheme.svelte
··· 47 47 defaultAccentColor = 'pink', 48 48 defaultBaseColor = 'stone', 49 49 selectAccentColor = true, 50 - selectBaseColor = true 50 + selectBaseColor = true, 51 + onchanged 51 52 }: { 52 53 defaultAccentColor?: string; 53 54 defaultBaseColor?: string; 54 55 selectAccentColor?: boolean; 55 56 selectBaseColor?: boolean; 57 + onchanged?: (accentColor: string, baseColor: string) => void; 56 58 } = $props(); 57 59 58 60 onMount(() => { ··· 90 92 window.dispatchEvent( 91 93 new CustomEvent('theme-changed', { detail: { accentColor: color.label } }) 92 94 ); 95 + 96 + onchanged?.(color.label, previous.label); 93 97 }} 94 98 class="w-64" 95 99 /> ··· 113 117 window.dispatchEvent( 114 118 new CustomEvent('theme-changed', { detail: { baseColor: color.label } }) 115 119 ); 120 + 121 + onchanged?.(color.label, previous.label); 116 122 }} 117 123 /> 118 124 {/if}
+10 -2
packages/colors/src/lib/components/select-theme/SelectThemePopover.svelte
··· 6 6 defaultAccentColor = 'pink', 7 7 defaultBaseColor = 'stone', 8 8 selectAccentColor = true, 9 - selectBaseColor = true 9 + selectBaseColor = true, 10 + onchanged 10 11 }: { 11 12 defaultAccentColor?: string; 12 13 defaultBaseColor?: string; 13 14 selectAccentColor?: boolean; 14 15 selectBaseColor?: boolean; 16 + onchanged?: (accentColor: string, baseColor: string) => void; 15 17 } = $props(); 16 18 </script> 17 19 ··· 37 39 {/if} 38 40 </button> 39 41 {/snippet} 40 - <SelectTheme {defaultAccentColor} {defaultBaseColor} {selectAccentColor} {selectBaseColor} /> 42 + <SelectTheme 43 + {defaultAccentColor} 44 + {defaultBaseColor} 45 + {selectAccentColor} 46 + {selectBaseColor} 47 + {onchanged} 48 + /> 41 49 </Popover>
+128
packages/text/src/lib/components/plain-text-editor/PlainTextEditor.svelte
··· 1 + <script lang="ts"> 2 + import { onDestroy, onMount } from 'svelte'; 3 + import { Editor, type Extensions, mergeAttributes, Node } from '@tiptap/core'; 4 + import Placeholder from '@tiptap/extension-placeholder'; 5 + import { type ParagraphOptions } from '@tiptap/extension-paragraph'; 6 + import Text from '@tiptap/extension-text'; 7 + import History from '@tiptap/extension-history'; 8 + import { cn } from '@fuxui/base'; 9 + 10 + let { 11 + class: className, 12 + placeholder = '', 13 + value = $bindable(''), 14 + ref = $bindable(null), 15 + editor = $bindable(null), 16 + allowMultiline = false, 17 + onupdate, 18 + ...props 19 + }: { 20 + class?: string; 21 + placeholder?: string; 22 + value?: string; 23 + ref?: HTMLElement | null; 24 + editor?: Editor | null; 25 + allowMultiline?: boolean; 26 + onupdate?: (value: string) => void; 27 + } = $props(); 28 + 29 + onMount(async () => { 30 + if (!ref || editor) return; 31 + 32 + const Document = Node.create({ 33 + name: 'doc', 34 + topNode: true, 35 + content: allowMultiline ? 'block+' : 'block' 36 + }); 37 + 38 + const Paragraph = Node.create<ParagraphOptions>({ 39 + name: 'paragraph', 40 + 41 + priority: 1000, 42 + 43 + addOptions() { 44 + return { 45 + HTMLAttributes: {} 46 + }; 47 + }, 48 + 49 + group: 'block', 50 + 51 + content: 'text*', 52 + 53 + parseHTML() { 54 + return [{ tag: 'p' }]; 55 + }, 56 + 57 + renderHTML({ HTMLAttributes }) { 58 + return ['p', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]; 59 + }, 60 + 61 + addCommands() { 62 + return { 63 + setParagraph: 64 + () => 65 + ({ commands }) => { 66 + return commands.setNode(this.name); 67 + } 68 + }; 69 + }, 70 + 71 + addKeyboardShortcuts() { 72 + return { 73 + 'Mod-Alt-0': () => this.editor.commands.setParagraph() 74 + }; 75 + } 76 + }); 77 + 78 + let extensions: Extensions = [Document.configure(), Paragraph.configure(), Text.configure(), History.configure()]; 79 + 80 + if (placeholder) { 81 + extensions.push( 82 + Placeholder.configure({ 83 + placeholder: placeholder 84 + }) 85 + ); 86 + } 87 + 88 + editor = new Editor({ 89 + element: ref, 90 + extensions: extensions, 91 + onUpdate: () => { 92 + onupdate?.(editor?.getText() ?? ''); 93 + 94 + value = editor?.getText() ?? ''; 95 + }, 96 + 97 + content: value, 98 + 99 + editorProps: { 100 + attributes: { 101 + class: 'outline-none pointer-events-auto' 102 + } 103 + } 104 + }); 105 + }); 106 + 107 + $effect(() => { 108 + if (!editor || editor.getText() === value) return; 109 + 110 + editor.commands.setContent(value); 111 + }); 112 + 113 + onDestroy(() => { 114 + editor?.destroy(); 115 + }); 116 + </script> 117 + 118 + <div class={cn('min-h-[1em]', className)} bind:this={ref} {...props}></div> 119 + 120 + <style> 121 + :global(.tiptap p.is-editor-empty:first-child::before) { 122 + color: var(--color-base-500); 123 + content: attr(data-placeholder); 124 + float: left; 125 + height: 0; 126 + pointer-events: none; 127 + } 128 + </style>
+1
packages/text/src/lib/components/plain-text-editor/index.ts
··· 1 + export { default as PlainTextEditor } from './PlainTextEditor.svelte';
+455
packages/text/src/lib/components/rich-text-editor/RichTextEditor.svelte
··· 1 + <script lang="ts"> 2 + import { onMount, onDestroy } from 'svelte'; 3 + import { Editor, type Content } from '@tiptap/core'; 4 + import StarterKit from '@tiptap/starter-kit'; 5 + import Placeholder from '@tiptap/extension-placeholder'; 6 + import Image from '@tiptap/extension-image'; 7 + import { common, createLowlight } from 'lowlight'; 8 + import CodeBlockLowlight from '@tiptap/extension-code-block-lowlight'; 9 + import BubbleMenu from '@tiptap/extension-bubble-menu'; 10 + import Strike from '@tiptap/extension-strike'; 11 + import Underline from '@tiptap/extension-underline'; 12 + import Link from '@tiptap/extension-link'; 13 + 14 + import './code.css'; 15 + import { Button, Input, Toggle } from '@fuxui/base'; 16 + 17 + let { 18 + content = $bindable({}), 19 + placeholder = 'Write something ...', 20 + editor = $bindable(null), 21 + ref = $bindable(null) 22 + }: { 23 + content: Content; 24 + placeholder?: string; 25 + editor?: Editor | null; 26 + ref?: HTMLDivElement | null; 27 + } = $props(); 28 + 29 + const lowlight = createLowlight(common); 30 + 31 + let hasFocus = true; 32 + 33 + let menu: HTMLElement | null = $state(null); 34 + 35 + let isBold = $state(false); 36 + let isItalic = $state(false); 37 + let isUnderline = $state(false); 38 + let isStrikethrough = $state(false); 39 + let isLink = $state(false); 40 + 41 + onMount(() => { 42 + if (!ref) return; 43 + 44 + let extensions = [ 45 + StarterKit.configure({ 46 + dropcursor: { 47 + class: 'text-base-500' 48 + }, 49 + codeBlock: false 50 + }), 51 + Placeholder.configure({ placeholder }), 52 + // Only use CustomImage, not the standard Image extension 53 + Image.configure({ 54 + HTMLAttributes: { 55 + class: 'max-w-full object-contain relative rounded-2xl' 56 + } 57 + }), 58 + CodeBlockLowlight.configure({ 59 + lowlight, 60 + defaultLanguage: 'js' 61 + }), 62 + BubbleMenu.configure({ 63 + element: menu, 64 + shouldShow: ({ editor }) => { 65 + // dont show if image selected or no selection or is code block 66 + return ( 67 + !editor.isActive('image') && 68 + !editor.view.state.selection.empty && 69 + !editor.isActive('codeBlock') 70 + ); 71 + } 72 + }), 73 + Strike.configure({}), 74 + Underline.configure({}), 75 + Link.configure({ 76 + openOnClick: false, 77 + autolink: true, 78 + defaultProtocol: 'https' 79 + }) 80 + ]; 81 + 82 + editor = new Editor({ 83 + element: ref, 84 + extensions, 85 + editorProps: { 86 + attributes: { 87 + class: 'outline-none' 88 + } 89 + }, 90 + onUpdate: (ctx) => { 91 + content = ctx.editor.getJSON(); 92 + }, 93 + onFocus: () => { 94 + hasFocus = true; 95 + }, 96 + onBlur: () => { 97 + hasFocus = false; 98 + }, 99 + onTransaction: (ctx) => { 100 + isBold = ctx.editor.isActive('bold'); 101 + isItalic = ctx.editor.isActive('italic'); 102 + isUnderline = ctx.editor.isActive('underline'); 103 + isStrikethrough = ctx.editor.isActive('strike'); 104 + isLink = ctx.editor.isActive('link'); 105 + 106 + if (!isLink) showLinkEdit = false; 107 + }, 108 + content 109 + }); 110 + 111 + menu?.classList.remove('hidden'); 112 + }); 113 + 114 + // Flag to track whether a file is being dragged over the drop area 115 + let isDragOver = $state(false); 116 + 117 + // Store local image files for later upload 118 + let localImages: Map<string, File> = $state(new Map()); 119 + 120 + // Track which image URLs in the editor are local previews 121 + let localImageUrls: Set<string> = $state(new Set()); 122 + 123 + // Process image file to create a local preview 124 + function processImageFile(file: File, input?: HTMLInputElement) { 125 + if (!editor) { 126 + console.warn('Tiptap editor not initialized'); 127 + return; 128 + } 129 + 130 + try { 131 + // Create a local blob URL for the image 132 + const localUrl = URL.createObjectURL(file); 133 + 134 + // Store the file for later upload 135 + localImages.set(localUrl, file); 136 + localImageUrls.add(localUrl); 137 + 138 + // Insert image into editor with the local URL 139 + editor 140 + .chain() 141 + .focus() 142 + .insertContent({ 143 + type: 'image', 144 + attrs: { 145 + src: localUrl, 146 + 'data-local': 'true' // Mark as local image 147 + } 148 + }) 149 + .run(); 150 + 151 + // Update content state to ensure persistence 152 + content = editor.getJSON(); 153 + 154 + // Clear the file input if provided 155 + if (input) input.value = ''; 156 + } catch (error) { 157 + console.error('Error creating image preview:', error); 158 + } 159 + } 160 + export function handlePaste(node: HTMLElement) { 161 + const pasteHandler = (event: ClipboardEvent) => { 162 + const items = event.clipboardData?.items; 163 + if (!items) return; 164 + // Check for image data in clipboard 165 + for (const item of Array.from(items)) { 166 + if (item.type.startsWith('image/')) { 167 + // Get the image file from clipboard 168 + const file = item.getAsFile(); 169 + if (!file) continue; 170 + // Prevent default paste behavior 171 + event.preventDefault(); 172 + processImageFile(file); 173 + // Only process the first image found 174 + return; 175 + } 176 + } 177 + }; 178 + 179 + node.addEventListener('paste', pasteHandler); 180 + 181 + return { 182 + destroy() { 183 + node.removeEventListener('paste', pasteHandler); 184 + } 185 + }; 186 + } 187 + 188 + // --- Drag-and-drop handlers for image upload --- 189 + function handleDragOver(event: DragEvent) { 190 + event.preventDefault(); 191 + event.stopPropagation(); 192 + isDragOver = true; 193 + } 194 + function handleDragLeave(event: DragEvent) { 195 + event.preventDefault(); 196 + event.stopPropagation(); 197 + isDragOver = false; 198 + } 199 + function handleDrop(event: DragEvent) { 200 + event.preventDefault(); 201 + event.stopPropagation(); 202 + isDragOver = false; 203 + if (!event.dataTransfer?.files?.length) return; 204 + const file = event.dataTransfer.files[0]; 205 + if (file?.type.startsWith('image/')) { 206 + processImageFile(file); 207 + } 208 + } 209 + 210 + onDestroy(() => { 211 + for (const localUrl of localImageUrls) { 212 + URL.revokeObjectURL(localUrl); 213 + } 214 + 215 + editor?.destroy(); 216 + }); 217 + 218 + let link = $state(''); 219 + 220 + let showLinkEdit = $state(false); 221 + 222 + let linkInput: HTMLInputElement | null = $state(null); 223 + </script> 224 + 225 + <div 226 + bind:this={ref} 227 + class="relative flex-1" 228 + use:handlePaste 229 + ondragover={handleDragOver} 230 + ondragleave={handleDragLeave} 231 + ondrop={handleDrop} 232 + role="region" 233 + ></div> 234 + 235 + <div 236 + bind:this={menu} 237 + class="menu bg-base-50 dark:bg-base-900 relative hidden w-fit rounded-2xl px-1 py-1 shadow-lg backdrop-blur-sm" 238 + > 239 + {#if !showLinkEdit} 240 + <Toggle 241 + size="sm" 242 + onclick={() => editor?.chain().focus().toggleBold().run()} 243 + bind:pressed={isBold} 244 + > 245 + <svg 246 + xmlns="http://www.w3.org/2000/svg" 247 + viewBox="0 0 24 24" 248 + fill="currentColor" 249 + class="size-6" 250 + > 251 + <path 252 + fill-rule="evenodd" 253 + d="M5.246 3.744a.75.75 0 0 1 .75-.75h7.125a4.875 4.875 0 0 1 3.346 8.422 5.25 5.25 0 0 1-2.97 9.58h-7.5a.75.75 0 0 1-.75-.75V3.744Zm7.125 6.75a2.625 2.625 0 0 0 0-5.25H8.246v5.25h4.125Zm-4.125 2.251v6h4.5a3 3 0 0 0 0-6h-4.5Z" 254 + clip-rule="evenodd" 255 + /> 256 + </svg> 257 + 258 + <span class="sr-only">Bold</span> 259 + </Toggle> 260 + 261 + <Toggle 262 + size="sm" 263 + onclick={() => editor?.chain().focus().toggleItalic().run()} 264 + bind:pressed={isItalic} 265 + > 266 + <svg 267 + xmlns="http://www.w3.org/2000/svg" 268 + viewBox="0 0 24 24" 269 + fill="currentColor" 270 + class="size-6" 271 + > 272 + <path 273 + fill-rule="evenodd" 274 + d="M10.497 3.744a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-3.275l-5.357 15.002h2.632a.75.75 0 1 1 0 1.5h-7.5a.75.75 0 1 1 0-1.5h3.275l5.357-15.002h-2.632a.75.75 0 0 1-.75-.75Z" 275 + clip-rule="evenodd" 276 + /> 277 + </svg> 278 + 279 + <span class="sr-only">Italic</span> 280 + </Toggle> 281 + 282 + <Toggle 283 + size="sm" 284 + onclick={() => editor?.chain().focus().toggleUnderline().run()} 285 + bind:pressed={isUnderline} 286 + > 287 + <svg 288 + xmlns="http://www.w3.org/2000/svg" 289 + viewBox="0 0 24 24" 290 + fill="currentColor" 291 + class="size-6" 292 + > 293 + <path 294 + fill-rule="evenodd" 295 + d="M5.995 2.994a.75.75 0 0 1 .75.75v7.5a5.25 5.25 0 1 0 10.5 0v-7.5a.75.75 0 0 1 1.5 0v7.5a6.75 6.75 0 1 1-13.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-3 17.252a.75.75 0 0 1 .75-.75h16.5a.75.75 0 0 1 0 1.5h-16.5a.75.75 0 0 1-.75-.75Z" 296 + clip-rule="evenodd" 297 + /> 298 + </svg> 299 + 300 + <span class="sr-only">Underline</span> 301 + </Toggle> 302 + 303 + <Toggle 304 + size="sm" 305 + onclick={() => editor?.chain().focus().toggleStrike().run()} 306 + bind:pressed={isStrikethrough} 307 + > 308 + <svg 309 + xmlns="http://www.w3.org/2000/svg" 310 + viewBox="0 0 24 24" 311 + fill="currentColor" 312 + class="size-6" 313 + > 314 + <path 315 + fill-rule="evenodd" 316 + d="M9.657 4.728c-1.086.385-1.766 1.057-1.979 1.85-.214.8.046 1.733.81 2.616.746.862 1.93 1.612 3.388 2.003.07.019.14.037.21.053h8.163a.75.75 0 0 1 0 1.5h-8.24a.66.66 0 0 1-.02 0H3.75a.75.75 0 0 1 0-1.5h4.78a7.108 7.108 0 0 1-1.175-1.074C6.372 9.042 5.849 7.61 6.229 6.19c.377-1.408 1.528-2.38 2.927-2.876 1.402-.497 3.127-.55 4.855-.086A8.937 8.937 0 0 1 16.94 4.6a.75.75 0 0 1-.881 1.215 7.437 7.437 0 0 0-2.436-1.14c-1.473-.394-2.885-.331-3.966.052Zm6.533 9.632a.75.75 0 0 1 1.03.25c.592.974.846 2.094.55 3.2-.378 1.408-1.529 2.38-2.927 2.876-1.402.497-3.127.55-4.855.087-1.712-.46-3.168-1.354-4.134-2.47a.75.75 0 0 1 1.134-.982c.746.862 1.93 1.612 3.388 2.003 1.473.394 2.884.331 3.966-.052 1.085-.384 1.766-1.056 1.978-1.85.169-.628.046-1.33-.381-2.032a.75.75 0 0 1 .25-1.03Z" 317 + clip-rule="evenodd" 318 + /> 319 + </svg> 320 + 321 + <span class="sr-only">Strikethrough</span> 322 + </Toggle> 323 + 324 + <Toggle 325 + size="sm" 326 + onclick={() => { 327 + if (isLink) { 328 + //tiptap?.chain().focus().unsetLink().run(); 329 + // get current link 330 + link = editor?.getAttributes('link').href; 331 + showLinkEdit = true; 332 + 333 + setTimeout(() => { 334 + linkInput?.focus(); 335 + }, 10); 336 + } else { 337 + link = ''; 338 + showLinkEdit = true; 339 + 340 + setTimeout(() => { 341 + linkInput?.focus(); 342 + }, 10); 343 + } 344 + }} 345 + bind:pressed={isLink} 346 + > 347 + <svg 348 + xmlns="http://www.w3.org/2000/svg" 349 + viewBox="0 0 24 24" 350 + fill="currentColor" 351 + class="size-6" 352 + > 353 + <path 354 + fill-rule="evenodd" 355 + d="M19.902 4.098a3.75 3.75 0 0 0-5.304 0l-4.5 4.5a3.75 3.75 0 0 0 1.035 6.037.75.75 0 0 1-.646 1.353 5.25 5.25 0 0 1-1.449-8.45l4.5-4.5a5.25 5.25 0 1 1 7.424 7.424l-1.757 1.757a.75.75 0 1 1-1.06-1.06l1.757-1.757a3.75 3.75 0 0 0 0-5.304Zm-7.389 4.267a.75.75 0 0 1 1-.353 5.25 5.25 0 0 1 1.449 8.45l-4.5 4.5a5.25 5.25 0 1 1-7.424-7.424l1.757-1.757a.75.75 0 1 1 1.06 1.06l-1.757 1.757a3.75 3.75 0 1 0 5.304 5.304l4.5-4.5a3.75 3.75 0 0 0-1.035-6.037.75.75 0 0 1-.354-1Z" 356 + clip-rule="evenodd" 357 + /> 358 + </svg> 359 + 360 + <span class="sr-only">Link</span> 361 + </Toggle> 362 + {:else} 363 + <div class="flex items-center gap-1"> 364 + <Input 365 + bind:ref={linkInput} 366 + sizeVariant="sm" 367 + bind:value={link} 368 + placeholder="Enter link" 369 + onblur={() => { 370 + if (link === '') { 371 + editor?.chain().focus().unsetLink().run(); 372 + } else { 373 + editor?.chain().focus().setLink({ href: link }).run(); 374 + } 375 + }} 376 + onkeydown={(e) => { 377 + if (e.key === 'Enter') { 378 + if (link === '') { 379 + editor?.chain().focus().unsetLink().run(); 380 + } else { 381 + editor?.chain().focus().setLink({ href: link }).run(); 382 + } 383 + showLinkEdit = false; 384 + } 385 + }} 386 + /> 387 + <Button 388 + size="iconSm" 389 + onclick={() => { 390 + if (link === '') { 391 + editor?.chain().focus().unsetLink().run(); 392 + } else { 393 + editor?.chain().focus().setLink({ href: link }).run(); 394 + } 395 + showLinkEdit = false; 396 + }} 397 + > 398 + <svg 399 + xmlns="http://www.w3.org/2000/svg" 400 + fill="none" 401 + viewBox="0 0 24 24" 402 + stroke-width="1.5" 403 + stroke="currentColor" 404 + class="size-6" 405 + > 406 + <path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5" /> 407 + </svg> 408 + 409 + <span class="sr-only">save link</span> 410 + </Button> 411 + <Button 412 + size="iconSm" 413 + onclick={() => { 414 + editor?.chain().focus().unsetLink().run(); 415 + showLinkEdit = false; 416 + }} 417 + variant="ghost" 418 + > 419 + <svg 420 + xmlns="http://www.w3.org/2000/svg" 421 + fill="none" 422 + viewBox="0 0 24 24" 423 + stroke-width="1.5" 424 + stroke="currentColor" 425 + > 426 + <path 427 + stroke-linecap="round" 428 + stroke-linejoin="round" 429 + d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" 430 + /> 431 + </svg> 432 + <span class="sr-only">remove link</span> 433 + </Button> 434 + </div> 435 + {/if} 436 + </div> 437 + 438 + <style> 439 + :global(.tiptap) { 440 + :first-child { 441 + margin-top: 0; 442 + } 443 + 444 + :global(img) { 445 + display: block; 446 + height: auto; 447 + margin: 1.5rem 0; 448 + max-width: 100%; 449 + 450 + &.ProseMirror-selectednode { 451 + outline: 3px solid var(--color-accent-500); 452 + } 453 + } 454 + } 455 + </style>
+74
packages/text/src/lib/components/rich-text-editor/code.css
··· 1 + /* Basic editor styles */ 2 + .tiptap { 3 + :first-child { 4 + margin-top: 0; 5 + } 6 + 7 + pre { 8 + background: var(--black); 9 + border-radius: 0.5rem; 10 + color: var(--white); 11 + font-family: 'JetBrainsMono', monospace; 12 + margin: 1.5rem 0; 13 + padding: 0.75rem 1rem; 14 + 15 + code { 16 + background: none; 17 + color: inherit; 18 + font-size: 0.8rem; 19 + padding: 0; 20 + } 21 + 22 + /* Code styling */ 23 + .hljs-comment, 24 + .hljs-quote { 25 + color: #616161; 26 + } 27 + 28 + .hljs-variable, 29 + .hljs-template-variable, 30 + .hljs-attribute, 31 + .hljs-tag, 32 + .hljs-regexp, 33 + .hljs-link, 34 + .hljs-name, 35 + .hljs-selector-id, 36 + .hljs-selector-class { 37 + color: #f98181; 38 + } 39 + 40 + .hljs-number, 41 + .hljs-meta, 42 + .hljs-built_in, 43 + .hljs-builtin-name, 44 + .hljs-literal, 45 + .hljs-type, 46 + .hljs-params { 47 + color: #fbbc88; 48 + } 49 + 50 + .hljs-string, 51 + .hljs-symbol, 52 + .hljs-bullet { 53 + color: #b9f18d; 54 + } 55 + 56 + .hljs-title, 57 + .hljs-section { 58 + color: #faf594; 59 + } 60 + 61 + .hljs-keyword, 62 + .hljs-selector-tag { 63 + color: #70cff8; 64 + } 65 + 66 + .hljs-emphasis { 67 + font-style: italic; 68 + } 69 + 70 + .hljs-strong { 71 + font-weight: 700; 72 + } 73 + } 74 + }
+1
packages/text/src/lib/components/rich-text-editor/index.ts
··· 1 + export { default as RichTextEditor } from './RichTextEditor.svelte';
+1 -1
apps/docs/src/routes/(main)/components/base/toggle-group/Example.svelte
··· 3 3 </script> 4 4 5 5 <div class="flex items-center gap-2"> 6 - <ToggleGroup type="single"> 6 + <ToggleGroup type="single" value="1"> 7 7 <ToggleGroupItem value="1">1</ToggleGroupItem> 8 8 <ToggleGroupItem value="2">2</ToggleGroupItem> 9 9 <ToggleGroupItem value="3">3</ToggleGroupItem>
+9 -3
apps/docs/src/routes/(main)/components/base/toggle-group/ToggleGroup.md
··· 2 2 import Example from './Example.svelte'; 3 3 </script> 4 4 5 - # Toggle 5 + # Toggle Group 6 6 7 7 ## Example 8 8 ··· 12 12 13 13 ```svelte 14 14 <script> 15 - import { Toggle } from '@fuxui/base'; 15 + import { ToggleGroup, ToggleGroupItem } from '@fuxui/base'; 16 + 17 + let value = $state('1'); 16 18 </script> 17 19 18 - <Toggle>Toggle</Toggle> 20 + <ToggleGroup type="single" bind:value> 21 + <ToggleGroupItem value="1">1</ToggleGroupItem> 22 + <ToggleGroupItem value="2">2</ToggleGroupItem> 23 + <ToggleGroupItem value="3">3</ToggleGroupItem> 24 + </ToggleGroup> 19 25 ```
+28 -1
apps/docs/src/routes/(main)/components/base/toggle/Example.svelte
··· 6 6 <Toggle>Toggle</Toggle> 7 7 8 8 <Toggle 9 - ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="size-6"> 9 + ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 10 + <path 11 + d="M11.7 2.805a.75.75 0 0 1 .6 0A60.65 60.65 0 0 1 22.83 8.72a.75.75 0 0 1-.231 1.337 49.948 49.948 0 0 0-9.902 3.912l-.003.002c-.114.06-.227.119-.34.18a.75.75 0 0 1-.707 0A50.88 50.88 0 0 0 7.5 12.173v-.224c0-.131.067-.248.172-.311a54.615 54.615 0 0 1 4.653-2.52.75.75 0 0 0-.65-1.352 56.123 56.123 0 0 0-4.78 2.589 1.858 1.858 0 0 0-.859 1.228 49.803 49.803 0 0 0-4.634-1.527.75.75 0 0 1-.231-1.337A60.653 60.653 0 0 1 11.7 2.805Z" 12 + /> 13 + <path 14 + d="M13.06 15.473a48.45 48.45 0 0 1 7.666-3.282c.134 1.414.22 2.843.255 4.284a.75.75 0 0 1-.46.711 47.87 47.87 0 0 0-8.105 4.342.75.75 0 0 1-.832 0 47.87 47.87 0 0 0-8.104-4.342.75.75 0 0 1-.461-.71c.035-1.442.121-2.87.255-4.286.921.304 1.83.634 2.726.99v1.27a1.5 1.5 0 0 0-.14 2.508c-.09.38-.222.753-.397 1.11.452.213.901.434 1.346.66a6.727 6.727 0 0 0 .551-1.607 1.5 1.5 0 0 0 .14-2.67v-.645a48.549 48.549 0 0 1 3.44 1.667 2.25 2.25 0 0 0 2.12 0Z" 15 + /> 16 + <path 17 + d="M4.462 19.462c.42-.419.753-.89 1-1.395.453.214.902.435 1.347.662a6.742 6.742 0 0 1-1.286 1.794.75.75 0 0 1-1.06-1.06Z" 18 + /> 19 + </svg> 20 + </Toggle> 21 + <Toggle size="sm" 22 + ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 23 + <path 24 + d="M11.7 2.805a.75.75 0 0 1 .6 0A60.65 60.65 0 0 1 22.83 8.72a.75.75 0 0 1-.231 1.337 49.948 49.948 0 0 0-9.902 3.912l-.003.002c-.114.06-.227.119-.34.18a.75.75 0 0 1-.707 0A50.88 50.88 0 0 0 7.5 12.173v-.224c0-.131.067-.248.172-.311a54.615 54.615 0 0 1 4.653-2.52.75.75 0 0 0-.65-1.352 56.123 56.123 0 0 0-4.78 2.589 1.858 1.858 0 0 0-.859 1.228 49.803 49.803 0 0 0-4.634-1.527.75.75 0 0 1-.231-1.337A60.653 60.653 0 0 1 11.7 2.805Z" 25 + /> 26 + <path 27 + d="M13.06 15.473a48.45 48.45 0 0 1 7.666-3.282c.134 1.414.22 2.843.255 4.284a.75.75 0 0 1-.46.711 47.87 47.87 0 0 0-8.105 4.342.75.75 0 0 1-.832 0 47.87 47.87 0 0 0-8.104-4.342.75.75 0 0 1-.461-.71c.035-1.442.121-2.87.255-4.286.921.304 1.83.634 2.726.99v1.27a1.5 1.5 0 0 0-.14 2.508c-.09.38-.222.753-.397 1.11.452.213.901.434 1.346.66a6.727 6.727 0 0 0 .551-1.607 1.5 1.5 0 0 0 .14-2.67v-.645a48.549 48.549 0 0 1 3.44 1.667 2.25 2.25 0 0 0 2.12 0Z" 28 + /> 29 + <path 30 + d="M4.462 19.462c.42-.419.753-.89 1-1.395.453.214.902.435 1.347.662a6.742 6.742 0 0 1-1.286 1.794.75.75 0 0 1-1.06-1.06Z" 31 + /> 32 + </svg> 33 + </Toggle> 34 + 35 + <Toggle size="lg" 36 + ><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"> 10 37 <path 11 38 d="M11.7 2.805a.75.75 0 0 1 .6 0A60.65 60.65 0 0 1 22.83 8.72a.75.75 0 0 1-.231 1.337 49.948 49.948 0 0 0-9.902 3.912l-.003.002c-.114.06-.227.119-.34.18a.75.75 0 0 1-.707 0A50.88 50.88 0 0 0 7.5 12.173v-.224c0-.131.067-.248.172-.311a54.615 54.615 0 0 1 4.653-2.52.75.75 0 0 0-.65-1.352 56.123 56.123 0 0 0-4.78 2.589 1.858 1.858 0 0 0-.859 1.228 49.803 49.803 0 0 0-4.634-1.527.75.75 0 0 1-.231-1.337A60.653 60.653 0 0 1 11.7 2.805Z" 12 39 />
+3 -1
apps/docs/src/routes/(main)/components/base/toggle/Toggle.md
··· 13 13 ```svelte 14 14 <script> 15 15 import { Toggle } from '@fuxui/base'; 16 + 17 + let pressed = $state(false); 16 18 </script> 17 19 18 - <Toggle>Toggle</Toggle> 20 + <Toggle bind:pressed>Toggle</Toggle> 19 21 ```
+10
apps/docs/src/routes/(main)/components/social/emoji-picker/EmojiPicker.md
··· 17 17 18 18 <EmojiPicker 19 19 onpicked={(emoji) => console.log('selected emoji: ' + emoji.unicode)} /> 20 + 21 + // or popover emoji picker 22 + 23 + <PopoverEmojiPicker onpicked={(emoji) => console.log('selected emoji: ' + emoji.unicode)}> 24 + {#snippet child({ props })} 25 + <Button size="iconLg" {...props}> 26 + Open Emoji Picker 27 + </Button> 28 + {/snippet} 29 + </PopoverEmojiPicker> 20 30 ```
+8
apps/docs/src/routes/(main)/components/text/plain-text-editor/+page.svelte
··· 1 + <script lang="ts"> 2 + import PlainTextEditorDocs from './PlainTextEditor.md'; 3 + import { Prose } from '@fuxui/base'; 4 + </script> 5 + 6 + <Prose> 7 + <PlainTextEditorDocs /> 8 + </Prose>
+11
apps/docs/src/routes/(main)/components/text/plain-text-editor/Example.svelte
··· 1 + <script lang="ts"> 2 + import { Box } from '@fuxui/base'; 3 + import { PlainTextEditor } from '@fuxui/text'; 4 + 5 + let content = $state(''); 6 + </script> 7 + 8 + <Box class="not-prose text-lg font-semibold"> 9 + <PlainTextEditor bind:value={content} placeholder="Write something..." /> 10 + </Box> 11 +
+21
apps/docs/src/routes/(main)/components/text/plain-text-editor/PlainTextEditor.md
··· 1 + <script lang="ts"> 2 + import Example from './Example.svelte'; 3 + </script> 4 + 5 + # Plain Text Editor 6 + 7 + ## Example 8 + 9 + <Example /> 10 + 11 + ## Usage 12 + 13 + ```svelte 14 + <script lang="ts"> 15 + import { PlainTextEditor } from '@fuxui/text'; 16 + 17 + let content = $state(''); 18 + </script> 19 + 20 + <PlainTextEditor bind:value={content} placeholder="Write something..." /> 21 + ```
+8
apps/docs/src/routes/(main)/components/text/rich-text-editor/+page.svelte
··· 1 + <script lang="ts"> 2 + import RichTextEditorDocs from './RichTextEditor.md'; 3 + import { Prose } from '@fuxui/base'; 4 + </script> 5 + 6 + <Prose> 7 + <RichTextEditorDocs /> 8 + </Prose>
+11
apps/docs/src/routes/(main)/components/text/rich-text-editor/Example.svelte
··· 1 + <script lang="ts"> 2 + import { RichTextEditor } from '@fuxui/text'; 3 + 4 + let content = $state(''); 5 + </script> 6 + 7 + <div 8 + class="border-base-300/50 bg-base-300/20 dark:border-base-800/50 dark:bg-base-900/30 text-base-900 dark:text-base-100 relative isolate min-h-24 w-full rounded-2xl border p-4 backdrop-blur-2xl" 9 + > 10 + <RichTextEditor bind:content placeholder="Write something..." /> 11 + </div>
+21
apps/docs/src/routes/(main)/components/text/rich-text-editor/RichTextEditor.md
··· 1 + <script lang="ts"> 2 + import Example from './Example.svelte'; 3 + </script> 4 + 5 + # Rich Text Editor 6 + 7 + ## Example 8 + 9 + <Example /> 10 + 11 + ## Usage 12 + 13 + ```svelte 14 + <script lang="ts"> 15 + import { RichTextEditor } from '@fuxui/text'; 16 + 17 + let content = $state(''); 18 + </script> 19 + 20 + <RichTextEditor bind:content={content} placeholder="Write something..." /> 21 + ```