Repository: melt-ui/melt-ui
Pull request #893 (2024-01-10 20:15:49)

allow 00 as values in minute and second segment for date field
Previously when User typed in `00` as the value for minute and second segment it would not get registered. This fixes the issue and allows `00` as a valid input for minute and second segment but disallowing for the other fields.

changeset-bot[bot]: ###  ⚠️  No Changeset found

Latest commit: af4f7aceeb50c0032349c59e25b767b1c8741378

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.**

<details><summary>This PR includes no changesets</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/sakibulalam/melt-ui/new/fix-date-field-00-minute-second-segment?filename=.changeset/warm-donkeys-eat.md&value=---%0A%22%40melt-ui%2Fsvelte%22%3A%20patch%0A---%0A%0Aallow%2000%20as%20values%20in%20minute%20and%20second%20segment%20for%20date%20field%0A)



Patch:
diff --git a/.changeset/cyan-rings-judge.md b/.changeset/cyan-rings-judge.md
new file mode 100644
index 00000000..bf8473ce
--- /dev/null
+++ b/.changeset/cyan-rings-judge.md
@@ -0,0 +1,5 @@
+---
+'@melt-ui/svelte': minor
+---
+
+Internal: withGet helper, increasing performance
diff --git a/.changeset/nice-stingrays-sell.md b/.changeset/nice-stingrays-sell.md
new file mode 100644
index 00000000..b1d5d857
--- /dev/null
+++ b/.changeset/nice-stingrays-sell.md
@@ -0,0 +1,5 @@
+---
+"@melt-ui/svelte": patch
+---
+
+Select: add `type="button"` to listbox trigger (closes: #710)
diff --git a/.changeset/warm-donkeys-eat.md b/.changeset/warm-donkeys-eat.md
new file mode 100644
index 00000000..87ab062e
--- /dev/null
+++ b/.changeset/warm-donkeys-eat.md
@@ -0,0 +1,5 @@
+---
+"@melt-ui/svelte": patch
+---
+
+Date/Range Field: fix: bug preventing `00` as value for minute and second segments (closes: #854)
diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml
index 04e01e6f..4fec03d0 100644
--- a/.github/workflows/preview.yml
+++ b/.github/workflows/preview.yml
@@ -16,6 +16,7 @@
 name: Preview Deployment
 on:
   pull_request_target:
+    types: [opened, synchronize]
 
 # cancel in-progress runs on new commits to same PR (github.event.number)
 concurrency:
@@ -74,7 +75,7 @@ jobs:
           accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
           githubToken: ${{ secrets.GITHUB_TOKEN }}
           projectName: melt-ui
-          directory: ./.svelte-kit/cloudflare
+          directory: ./build
           deploymentName: Preview
 
   untrusted-preview:
@@ -121,6 +122,6 @@ jobs:
           accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
           githubToken: ${{ secrets.GITHUB_TOKEN }}
           projectName: melt-ui
-          directory: ./.svelte-kit/cloudflare
+          directory: ./build
           deploymentName: Preview
 
diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml
index dd91ca03..8c254477 100644
--- a/.github/workflows/production.yml
+++ b/.github/workflows/production.yml
@@ -40,6 +40,8 @@ jobs:
 
       - name: Build site
         run: pnpm build
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 
       - name: Deploy to Cloudflare Pages
         uses: AdrianGonz97/refined-cf-pages-action@v1
@@ -48,5 +50,5 @@ jobs:
           accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
           githubToken: ${{ secrets.GITHUB_TOKEN }}
           projectName: melt-ui
-          directory: ./.svelte-kit/cloudflare
+          directory: ./build
           deploymentName: Production
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 484589d7..93ef862e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -260,7 +260,7 @@ packages:
     engines: {node: '>=6.0.0'}
     dependencies:
       '@jridgewell/gen-mapping': 0.3.3
-      '@jridgewell/trace-mapping': 0.3.18
+      '@jridgewell/trace-mapping': 0.3.20
     dev: true
 
   /@aw-web-design/x-default-browser@1.4.126:
@@ -274,14 +274,7 @@ packages:
     resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/highlight': 7.18.6
-    dev: true
-
-  /@babel/code-frame@7.22.5:
-    resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/highlight': 7.22.5
+      '@babel/highlight': 7.23.4
     dev: true
 
   /@babel/code-frame@7.23.5:
@@ -307,15 +300,15 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@ampproject/remapping': 2.2.1
-      '@babel/code-frame': 7.22.5
-      '@babel/generator': 7.22.9
+      '@babel/code-frame': 7.23.5
+      '@babel/generator': 7.23.6
       '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.22.9)
       '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.9)
       '@babel/helpers': 7.22.6
-      '@babel/parser': 7.22.7
-      '@babel/template': 7.22.5
-      '@babel/traverse': 7.22.8
-      '@babel/types': 7.22.5
+      '@babel/parser': 7.23.6
+      '@babel/template': 7.22.15
+      '@babel/traverse': 7.23.7
+      '@babel/types': 7.23.6
       convert-source-map: 1.9.0
       debug: 4.3.4
       gensync: 1.0.0-beta.2
@@ -337,7 +330,7 @@ packages:
       '@babel/helpers': 7.23.6
       '@babel/parser': 7.23.6
       '@babel/template': 7.22.15
-      '@babel/traverse': 7.23.6
+      '@babel/traverse': 7.23.7
       '@babel/types': 7.23.6
       convert-source-map: 2.0.0
       debug: 4.3.4
@@ -348,16 +341,6 @@ packages:
       - supports-color
     dev: true
 
-  /@babel/generator@7.22.9:
-    resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.22.5
-      '@jridgewell/gen-mapping': 0.3.3
-      '@jridgewell/trace-mapping': 0.3.20
-      jsesc: 2.5.2
-    dev: true
-
   /@babel/generator@7.23.6:
     resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==}
     engines: {node: '>=6.9.0'}
@@ -415,8 +398,8 @@ packages:
     dependencies:
       '@babel/core': 7.23.6
       '@babel/helper-annotate-as-pure': 7.22.5
-      '@babel/helper-environment-visitor': 7.22.5
-      '@babel/helper-function-name': 7.22.5
+      '@babel/helper-environment-visitor': 7.22.20
+      '@babel/helper-function-name': 7.23.0
       '@babel/helper-member-expression-to-functions': 7.22.5
       '@babel/helper-optimise-call-expression': 7.22.5
       '@babel/helper-replace-supers': 7.22.9(@babel/core@7.23.6)
@@ -487,19 +470,6 @@ packages:
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helper-environment-visitor@7.22.5:
-    resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-function-name@7.22.5:
-    resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.22.5
-      '@babel/types': 7.22.5
-    dev: true
-
   /@babel/helper-function-name@7.23.0:
     resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
     engines: {node: '>=6.9.0'}
@@ -540,7 +510,7 @@ packages:
     resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.22.5
+      '@babel/types': 7.23.6
     dev: true
 
   /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9):
@@ -550,11 +520,11 @@ packages:
       '@babel/core': ^7.0.0
     dependencies:
       '@babel/core': 7.22.9
-      '@babel/helper-environment-visitor': 7.22.5
+      '@babel/helper-environment-visitor': 7.22.20
       '@babel/helper-module-imports': 7.22.5
       '@babel/helper-simple-access': 7.22.5
       '@babel/helper-split-export-declaration': 7.22.6
-      '@babel/helper-validator-identifier': 7.22.5
+      '@babel/helper-validator-identifier': 7.22.20
     dev: true
 
   /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6):
@@ -614,7 +584,7 @@ packages:
       '@babel/core': ^7.0.0
     dependencies:
       '@babel/core': 7.23.6
-      '@babel/helper-environment-visitor': 7.22.5
+      '@babel/helper-environment-visitor': 7.22.20
       '@babel/helper-member-expression-to-functions': 7.22.5
       '@babel/helper-optimise-call-expression': 7.22.5
     dev: true
@@ -640,31 +610,16 @@ packages:
       '@babel/types': 7.23.6
     dev: true
 
-  /@babel/helper-string-parser@7.22.5:
-    resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
   /@babel/helper-string-parser@7.23.4:
     resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helper-validator-identifier@7.19.1:
-    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
   /@babel/helper-validator-identifier@7.22.20:
     resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
     engines: {node: '>=6.9.0'}
     dev: true
 
-  /@babel/helper-validator-identifier@7.22.5:
-    resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
   /@babel/helper-validator-option@7.22.5:
     resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==}
     engines: {node: '>=6.9.0'}
@@ -679,7 +634,7 @@ packages:
     resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/helper-function-name': 7.22.5
+      '@babel/helper-function-name': 7.23.0
       '@babel/template': 7.22.15
       '@babel/types': 7.23.6
     dev: true
@@ -688,9 +643,9 @@ packages:
     resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/template': 7.22.5
-      '@babel/traverse': 7.22.8
-      '@babel/types': 7.22.5
+      '@babel/template': 7.22.15
+      '@babel/traverse': 7.23.7
+      '@babel/types': 7.23.6
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -700,30 +655,12 @@ packages:
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/template': 7.22.15
-      '@babel/traverse': 7.23.6
+      '@babel/traverse': 7.23.7
       '@babel/types': 7.23.6
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@babel/highlight@7.18.6:
-    resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.19.1
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-    dev: true
-
-  /@babel/highlight@7.22.5:
-    resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.22.5
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-    dev: true
-
   /@babel/highlight@7.23.4:
     resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==}
     engines: {node: '>=6.9.0'}
@@ -733,14 +670,6 @@ packages:
       js-tokens: 4.0.0
     dev: true
 
-  /@babel/parser@7.22.7:
-    resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.22.5
-    dev: true
-
   /@babel/parser@7.23.6:
     resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==}
     engines: {node: '>=6.0.0'}
@@ -1742,31 +1671,13 @@ packages:
     resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/code-frame': 7.22.5
-      '@babel/parser': 7.22.7
-      '@babel/types': 7.22.5
-    dev: true
-
-  /@babel/traverse@7.22.8:
-    resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.22.5
-      '@babel/generator': 7.22.9
-      '@babel/helper-environment-visitor': 7.22.5
-      '@babel/helper-function-name': 7.22.5
-      '@babel/helper-hoist-variables': 7.22.5
-      '@babel/helper-split-export-declaration': 7.22.6
-      '@babel/parser': 7.22.7
-      '@babel/types': 7.22.5
-      debug: 4.3.4
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
+      '@babel/code-frame': 7.23.5
+      '@babel/parser': 7.23.6
+      '@babel/types': 7.23.6
     dev: true
 
-  /@babel/traverse@7.23.6:
-    resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==}
+  /@babel/traverse@7.23.7:
+    resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==}
     engines: {node: '>=6.9.0'}
     dependencies:
       '@babel/code-frame': 7.23.5
@@ -1787,8 +1698,8 @@ packages:
     resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/helper-string-parser': 7.22.5
-      '@babel/helper-validator-identifier': 7.22.5
+      '@babel/helper-string-parser': 7.23.4
+      '@babel/helper-validator-identifier': 7.22.20
       to-fast-properties: 2.0.0
     dev: true
 
@@ -2471,7 +2382,7 @@ packages:
     dependencies:
       '@jridgewell/set-array': 1.1.2
       '@jridgewell/sourcemap-codec': 1.4.15
-      '@jridgewell/trace-mapping': 0.3.18
+      '@jridgewell/trace-mapping': 0.3.20
     dev: true
 
   /@jridgewell/resolve-uri@3.1.0:
@@ -3853,7 +3764,7 @@ packages:
     dependencies:
       '@babel/generator': 7.23.6
       '@babel/parser': 7.23.6
-      '@babel/traverse': 7.23.6
+      '@babel/traverse': 7.23.7
       '@babel/types': 7.23.6
       '@storybook/csf': 0.1.2
       '@storybook/types': 7.6.6
@@ -4458,8 +4369,8 @@ packages:
   /@types/babel__core@7.20.1:
     resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
     dependencies:
-      '@babel/parser': 7.22.7
-      '@babel/types': 7.22.5
+      '@babel/parser': 7.23.6
+      '@babel/types': 7.23.6
       '@types/babel__generator': 7.6.4
       '@types/babel__template': 7.4.1
       '@types/babel__traverse': 7.20.0
@@ -4468,20 +4379,20 @@ packages:
   /@types/babel__generator@7.6.4:
     resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
     dependencies:
-      '@babel/types': 7.22.5
+      '@babel/types': 7.23.6
     dev: true
 
   /@types/babel__template@7.4.1:
     resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
     dependencies:
-      '@babel/parser': 7.22.7
-      '@babel/types': 7.22.5
+      '@babel/parser': 7.23.6
+      '@babel/types': 7.23.6
     dev: true
 
   /@types/babel__traverse@7.20.0:
     resolution: {integrity: sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==}
     dependencies:
-      '@babel/types': 7.22.5
+      '@babel/types': 7.23.6
     dev: true
 
   /@types/body-parser@1.19.2:
@@ -8261,7 +8172,7 @@ packages:
     engines: {node: '>=8'}
     dependencies:
       '@babel/core': 7.22.9
-      '@babel/parser': 7.22.7
+      '@babel/parser': 7.23.6
       '@istanbuljs/schema': 0.1.3
       istanbul-lib-coverage: 3.2.0
       semver: 6.3.1
@@ -9833,7 +9744,7 @@ packages:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
     dependencies:
-      '@babel/code-frame': 7.21.4
+      '@babel/code-frame': 7.23.5
       error-ex: 1.3.2
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
@@ -11608,7 +11519,7 @@ packages:
     dependencies:
       '@ampproject/remapping': 2.2.1
       '@jridgewell/sourcemap-codec': 1.4.15
-      '@jridgewell/trace-mapping': 0.3.18
+      '@jridgewell/trace-mapping': 0.3.20
       acorn: 8.9.0
       aria-query: 5.3.0
       axobject-query: 3.2.1
@@ -12344,7 +12255,7 @@ packages:
     resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
     engines: {node: '>=10.12.0'}
     dependencies:
-      '@jridgewell/trace-mapping': 0.3.18
+      '@jridgewell/trace-mapping': 0.3.20
       '@types/istanbul-lib-coverage': 2.0.4
       convert-source-map: 1.9.0
     dev: true
diff --git a/src/docs/previews/tabs/main/tailwind/index.svelte b/src/docs/previews/tabs/main/tailwind/index.svelte
index 76b1e418..e2c4155c 100644
--- a/src/docs/previews/tabs/main/tailwind/index.svelte
+++ b/src/docs/previews/tabs/main/tailwind/index.svelte
@@ -99,7 +99,7 @@
 			>
 				New email
 			</label>
-			<input id="new" type="password" />
+			<input id="new" type="email" />
 		</fieldset>
 		<div class="mt-5 flex justify-end">
 			<button class="save">Save changes</button>
diff --git a/src/lib/builders/checkbox/create.ts b/src/lib/builders/checkbox/create.ts
index a1a5422c..03f95b17 100644
--- a/src/lib/builders/checkbox/create.ts
+++ b/src/lib/builders/checkbox/create.ts
@@ -10,7 +10,7 @@ import {
 	toWritableStores,
 } from '$lib/internal/helpers/index.js';
 import type { Defaults, MeltActionReturn } from '$lib/internal/types.js';
-import { derived, get, writable } from 'svelte/store';
+import { derived, writable } from 'svelte/store';
 import type { CheckboxEvents } from './events.js';
 import type { CreateCheckboxProps } from './types.js';
 
@@ -53,7 +53,7 @@ export function createCheckbox(props?: CreateCheckboxProps) {
 					if (e.key === kbd.ENTER) e.preventDefault();
 				}),
 				addMeltEventListener(node, 'click', () => {
-					if (get(disabled)) return;
+					if (disabled.get()) return;
 
 					checked.update((value) => {
 						if (value === 'indeterminate') return true;
diff --git a/src/lib/builders/date-field/create.ts b/src/lib/builders/date-field/create.ts
index 5e5b0a22..c5a92aa5 100644
--- a/src/lib/builders/date-field/create.ts
+++ b/src/lib/builders/date-field/create.ts
@@ -1428,7 +1428,7 @@ export function createDateField(props?: CreateDateFieldProps) {
 					if (num === 0) {
 						states.minute.lastKeyZero = true;
 						announcer.announce(null);
-						return null;
+						return 0;
 					}
 
 					/**
@@ -1613,7 +1613,7 @@ export function createDateField(props?: CreateDateFieldProps) {
 					if (num === 0) {
 						states.second.lastKeyZero = true;
 						announcer.announce(null);
-						return null;
+						return 0;
 					}
 
 					/**
diff --git a/src/lib/builders/listbox/create.ts b/src/lib/builders/listbox/create.ts
index dede2524..90ebbd01 100644
--- a/src/lib/builders/listbox/create.ts
+++ b/src/lib/builders/listbox/create.ts
@@ -285,6 +285,7 @@ export function createListbox<
 				id: $triggerId,
 				role: 'combobox',
 				disabled: disabledAttr($disabled),
+				type: withDefaults.builder === 'select' ? 'button' : undefined,
 			} as const;
 		},
 		action: (node: HTMLElement): MeltActionReturn<ListboxEvents['trigger']> => {
diff --git a/src/lib/internal/helpers/store/toWritableStores.ts b/src/lib/internal/helpers/store/toWritableStores.ts
index f01de659..43601869 100644
--- a/src/lib/internal/helpers/store/toWritableStores.ts
+++ b/src/lib/internal/helpers/store/toWritableStores.ts
@@ -1,7 +1,8 @@
 import { type Writable, writable } from 'svelte/store';
+import { withGet, type WithGet } from '../withGet';
 
 export type ToWritableStores<T extends Record<string, unknown>> = {
-	[K in keyof T]: Writable<T[K]>;
+	[K in keyof T]: WithGet<Writable<T[K]>>;
 };
 
 /**
@@ -11,12 +12,12 @@ export type ToWritableStores<T extends Record<string, unknown>> = {
 export function toWritableStores<T extends Record<string, unknown>>(
 	properties: T
 ): ToWritableStores<T> {
-	const result = {} as { [K in keyof T]: Writable<T[K]> };
+	const result = {} as { [K in keyof T]: WithGet<Writable<T[K]>> };
 
 	Object.keys(properties).forEach((key) => {
 		const propertyKey = key as keyof T;
 		const value = properties[propertyKey];
-		result[propertyKey] = writable(value);
+		result[propertyKey] = withGet(writable(value));
 	});
 
 	return result;
diff --git a/src/lib/internal/helpers/withGet.ts b/src/lib/internal/helpers/withGet.ts
new file mode 100644
index 00000000..ad317390
--- /dev/null
+++ b/src/lib/internal/helpers/withGet.ts
@@ -0,0 +1,44 @@
+import { get, type Writable } from 'svelte/store';
+
+type WritableValue<T> = T extends Writable<infer V> ? V : never;
+
+export type WithGet<T extends Writable<unknown>> = T & {
+	get: () => WritableValue<T>;
+};
+
+export function withGet<T extends Writable<unknown>>(store: T): WithGet<T> {
+	let value = get(store);
+
+	const update: (typeof store)['update'] = (cb) => {
+		store.update((v) => {
+			const nv = cb(v);
+			value = nv;
+			return nv;
+		});
+	};
+
+	const set: (typeof store)['set'] = (v) => {
+		update(() => v);
+	};
+
+	return {
+		...store,
+		get: () => value as WritableValue<T>,
+		update,
+		set,
+	};
+}
+
+export function addGetToStores<T extends Record<string, Writable<unknown>>>(stores: T) {
+	return Object.keys(stores).reduce(
+		(acc, key) => {
+			return {
+				...acc,
+				[key]: withGet(stores[key]),
+			};
+		},
+		{} as {
+			[K in keyof T]: WithGet<T[K]>;
+		}
+	);
+}
diff --git a/src/routes/docs/[...slug]/+page.server.ts b/src/routes/docs/[...slug]/+page.server.ts
index f5214927..ef108d99 100644
--- a/src/routes/docs/[...slug]/+page.server.ts
+++ b/src/routes/docs/[...slug]/+page.server.ts
@@ -1,9 +1,7 @@
 import { navConfig } from '$docs/config.js';
 import type { EntryGenerator, PageLoad } from './$types.js';
 
-// eslint-disable-next-line @typescript-eslint/ban-ts-comment
-// @ts-ignore
-import { GITHUB_TOKEN } from '$env/static/private';
+import { env } from '$env/dynamic/private';
 
 export const entries = (() => {
 	return navConfig.sidebarNav[0].items.map((item) => {
@@ -40,11 +38,13 @@ let storedContributors: FullContributor[] | undefined;
 const getContributors = async () => {
 	if (!storedContributors) {
 		try {
+			if (env.GITHUB_TOKEN === undefined) return [];
+
 			// eslint-disable-next-line no-console
 			console.log('Fetching contributors...');
 			const res = await fetch(`https://api.github.com/repos/melt-ui/melt-ui/contributors`, {
 				headers: {
-					Authorization: `Bearer ${GITHUB_TOKEN}`,
+					Authorization: `Bearer ${env.GITHUB_TOKEN}`,
 				},
 			});
 
@@ -54,7 +54,7 @@ const getContributors = async () => {
 				contributors.map(async (contributor) => {
 					const res = await fetch(`https://api.github.com/users/${contributor.login}`, {
 						headers: {
-							Authorization: `Bearer ${GITHUB_TOKEN}`,
+							Authorization: `Bearer ${env.GITHUB_TOKEN}`,
 						},
 					});
 					const { name, bio } = await res.json();


Test patch:
diff --git a/src/tests/date-field/DateField.spec.ts b/src/tests/date-field/DateField.spec.ts
index 63da56dd..3f738f84 100644
--- a/src/tests/date-field/DateField.spec.ts
+++ b/src/tests/date-field/DateField.spec.ts
@@ -14,7 +14,7 @@ import {
 import type { CreateDateFieldProps } from '$lib';
 
 const calendarDateOther = new CalendarDate(1980, 1, 20);
-const calendarDateTimeOther = new CalendarDateTime(1980, 1, 20, 12, 30, 0, 0);
+const calendarDateTimeOther = new CalendarDateTime(1980, 1, 20, 12, 30, 30, 0);
 const zonedDateTimeOther = toZoned(calendarDateTimeOther, 'America/New_York');
 
 function setup(props: CreateDateFieldProps = {}) {
@@ -491,6 +491,101 @@ describe('DateField', () => {
 		expect(minuteSegment).toHaveTextContent('1');
 	});
 
+	test('fully overwrite on first click and type - second', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const secondSegment = getByTestId('second');
+		await user.click(secondSegment);
+		expect(secondSegment).toHaveFocus();
+		expect(secondSegment).toHaveTextContent('30');
+		await user.keyboard(`{1}`);
+		expect(secondSegment).toHaveTextContent('1');
+	});
+
+	test('disallows 00 as value - month', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const monthSegment = getByTestId('month');
+		await user.click(monthSegment);
+		expect(monthSegment).toHaveFocus();
+		expect(monthSegment).toHaveTextContent('1');
+		await user.keyboard(`{0}`);
+		await user.keyboard(`{0}`);
+		expect(monthSegment).toHaveTextContent('mm');
+	});
+
+	test('disallows 00 as value - day', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const daySegment = getByTestId('day');
+		await user.click(daySegment);
+		expect(daySegment).toHaveFocus();
+		expect(daySegment).toHaveTextContent('20');
+		await user.keyboard(`{0}`);
+		await user.keyboard(`{0}`);
+		expect(daySegment).toHaveTextContent('dd');
+	});
+
+	test('disallows 00 as value - hour', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const hourSegment = getByTestId('hour');
+		await user.click(hourSegment);
+		expect(hourSegment).toHaveFocus();
+		expect(hourSegment).toHaveTextContent('12');
+		await user.keyboard(`{0}`);
+		await user.keyboard(`{0}`);
+		expect(hourSegment).toHaveTextContent('––');
+	});
+
+	test('allows 00 as value - minute', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const minuteSegment = getByTestId('minute');
+		await user.click(minuteSegment);
+		expect(minuteSegment).toHaveFocus();
+		expect(minuteSegment).toHaveTextContent('30');
+		await user.keyboard(`{0}`);
+		await user.keyboard(`{0}`);
+		expect(minuteSegment).toHaveTextContent('00');
+	});
+
+	test('allows 00 as value - second', async () => {
+		const user = userEvent.setup();
+		const { getByTestId } = setup({
+			defaultValue: calendarDateTimeOther,
+			granularity: 'second',
+		});
+
+		const secondSegment = getByTestId('second');
+		await user.click(secondSegment);
+		expect(secondSegment).toHaveFocus();
+		expect(secondSegment).toHaveTextContent('30');
+		await user.keyboard(`{0}`);
+		await user.keyboard(`{0}`);
+		expect(secondSegment).toHaveTextContent('00');
+	});
+
 	test('displays correct timezone with ZonedDateTime value - now', async () => {
 		const { getByTestId } = setup({
 			defaultValue: now('America/Los_Angeles'),
diff --git a/src/tests/select/Select.spec.ts b/src/tests/select/Select.spec.ts
index d68dfc47..cfc8c062 100644
--- a/src/tests/select/Select.spec.ts
+++ b/src/tests/select/Select.spec.ts
@@ -237,6 +237,12 @@ describe('Select', () => {
 		expect(label.id).toBe(ids.label);
 	});
 
+	test('Applies type="button" to the select trigger', async () => {
+		const { getByTestId } = render(SelectTest, { closeOnEscape: false });
+		const trigger = getByTestId('trigger');
+		expect(trigger).toHaveAttribute('type', 'button');
+	});
+
 	test.todo('Disabled select cannot be opened');
 	test.todo('Options loop when loop prop is set');
 });