diff --git a/.chromatic/custom-addons/chromatic/chromatic.css b/.chromatic/custom-addons/chromatic/chromatic.css deleted file mode 100644 index 35b8eab08ec..00000000000 --- a/.chromatic/custom-addons/chromatic/chromatic.css +++ /dev/null @@ -1,57 +0,0 @@ - - -/* pulled from https://use.typekit.net/uma8ayv.css to avoid an extra http request */ -@font-face { - font-family: "adobe-clean"; - src: url(data:font/woff;charset=utf-8;base64,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) format('woff'); - font-display: swap; - font-style: normal; - font-weight: 400; -} - -@font-face { - font-family: "adobe-clean"; - src: url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff2"),url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff"),url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("opentype"); - font-display: swap; - font-style: italic; - font-weight: 400; -} - -@font-face { - font-family: "adobe-clean"; - src: url(data:font/woff;charset=utf-8;base64,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 - ) format('woff'); - font-display: swap; - font-style: normal; - font-weight: 700; -} - -@font-face { - font-family: "adobe-clean"; - src: url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff2"),url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff"),url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("opentype"); - font-display: swap; - font-style: normal; - font-weight: 300; -} - -@font-face { - font-family: "adobe-clean-serif"; - src: url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); - font-display: swap; - font-style: normal; - font-weight: 900; -} - -.tk-adobe-clean { - font-family: "adobe-clean",sans-serif; -} - -.tk-adobe-clean-serif { - font-family: "adobe-clean-serif",sans-serif; -} - -.disableAnimations * { - animation: none !important; - transition: none !important; - transition-duration: 0s; -} diff --git a/.chromatic/custom-addons/chromatic/index.js b/.chromatic/custom-addons/chromatic/index.js index 24f1a329b84..bab8d2934c0 100644 --- a/.chromatic/custom-addons/chromatic/index.js +++ b/.chromatic/custom-addons/chromatic/index.js @@ -2,7 +2,6 @@ import {locales, scales, themes} from '../../constants'; import {makeDecorator} from '@storybook/addons'; import {Provider, View} from '@adobe/react-spectrum'; import React, {useEffect} from 'react'; -import styles from './chromatic.css'; export const withChromaticProvider = makeDecorator({ name: 'withChromaticProvider', diff --git a/.chromatic/preview-head.html b/.chromatic/preview-head.html index 7569aabc587..e3d739d228b 100644 --- a/.chromatic/preview-head.html +++ b/.chromatic/preview-head.html @@ -1 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.circleci/config.yml b/.circleci/config.yml index e6c64a8289d..4bc3bc333e0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,15 +1,35 @@ version: 2.1 + orbs: azure-cli: circleci/azure-cli@1.2.0 -jobs: - install: + +executors: + rsp: docker: - - image: circleci/node:12 + - image: cimg/node:12.22 + environment: + CACHE_VERSION: v1 + working_directory: ~/react-spectrum + + rsp-large: + docker: + - image: cimg/node:12.22 resource_class: large environment: CACHE_VERSION: v1 + working_directory: ~/react-spectrum + rsp-xlarge: + docker: + - image: cimg/node:12.22 + resource_class: xlarge + environment: + CACHE_VERSION: v1 working_directory: ~/react-spectrum + +jobs: + install: + executor: rsp-large steps: - checkout - restore_cache: @@ -41,13 +61,7 @@ jobs: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} install-17: - docker: - - image: circleci/node:12 - resource_class: large - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-large steps: - checkout - restore_cache: @@ -67,13 +81,7 @@ jobs: key: react-spectrum17-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} test-ssr: - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -84,13 +92,7 @@ jobs: test: parallelism: 3 - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -115,13 +117,7 @@ jobs: path: ~/junit test-ssr-17: - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum17-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -133,13 +129,7 @@ jobs: test-17: parallelism: 3 - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum17-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -162,12 +152,7 @@ jobs: path: ~/junit lint: - docker: - - image: circleci/node:12 - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -177,13 +162,7 @@ jobs: command: yarn lint storybook: - docker: - - image: circleci/node:12 - resource_class: large - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-large steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -198,13 +177,7 @@ jobs: - '*/storybook/' storybook-17: - docker: - - image: circleci/node:12 - resource_class: large - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-large steps: - restore_cache: key: react-spectrum17-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -219,13 +192,7 @@ jobs: - '*/storybook-17/' docs: - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -240,13 +207,7 @@ jobs: - '*/docs/' docs-production: - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} @@ -282,12 +243,7 @@ jobs: command: az storage blob upload-batch -d "\$web" -s /tmp/dist/production/docs --account-name reactspectrum comment: - docker: - - image: circleci/node:12 - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp steps: - checkout - restore_cache: @@ -301,13 +257,7 @@ jobs: fi publish-nightly: - docker: - - image: circleci/node:12 - resource_class: xlarge - environment: - CACHE_VERSION: v1 - - working_directory: ~/react-spectrum + executor: rsp-xlarge steps: - restore_cache: key: react-spectrum-{{ .Environment.CACHE_VERSION }}-{{ .Environment.CIRCLE_SHA1 }} diff --git a/.eslintrc.js b/.eslintrc.js index 36db535942f..681ffcb6b73 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,6 +35,8 @@ module.exports = { // enable this rule to see literally everything missing jsdocs, this rule needs some refinement but is good as a sanity check. // 'jsdoc/require-jsdoc': [ERROR, {contexts:['TSInterfaceDeclaration TSPropertySignature', 'TSInterfaceDeclaration TSMethodSignature']}], 'jsdoc/require-description': [ERROR, {exemptedBy: ['deprecated'], checkConstructors: false}], + 'no-redeclare': OFF, + '@typescript-eslint/no-redeclare': ERROR, 'no-unused-vars': OFF, '@typescript-eslint/no-unused-vars': ERROR, '@typescript-eslint/member-delimiter-style': [ERROR, { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 13ec1a02e38..90f4235515d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,3 @@ packages/@adobe/spectrum-css-temp/** @lazd @garthdb -packages/** @LFDanLu @ktabors @snowystinger @dannify @devongovett @pst67662 @MilanBrkicFON @MidnightCoder06 +packages/** @LFDanLu @ktabors @snowystinger @dannify @devongovett @reidbarber ** @snowystinger @dannify @devongovett diff --git a/.parcelrc b/.parcelrc index 90078f5ff97..e3b1d70c3f7 100644 --- a/.parcelrc +++ b/.parcelrc @@ -2,6 +2,7 @@ "extends": "@parcel/config-default", "resolvers": ["parcel-resolver-docs", "..."], "transformers": { + "apiCheck:*.{js,ts,tsx,json}": ["parcel-transformer-docs"], "docs:*.{js,ts,tsx,json}": ["parcel-transformer-docs", "@parcel/transformer-inline"], "docs-json:*.{js,ts,tsx,json}": ["parcel-transformer-docs"], "*.{md,mdx}": ["parcel-transformer-mdx-docs"], diff --git a/.storybook/theme.register.js b/.storybook/theme.register.js index db529a1bb6b..12abdf50f74 100644 --- a/.storybook/theme.register.js +++ b/.storybook/theme.register.js @@ -2,7 +2,7 @@ import {themes} from '@storybook/theming'; import addons from '@storybook/addons'; import {FORCE_RE_RENDER} from '@storybook/core-events'; // temporary until we have a better place to grab it from -import * as packageJSON from '../packages/@react-spectrum/alert/package.json'; +import * as packageJSON from '../packages/@adobe/react-spectrum/package.json'; // Automatically switch light/dark theme based on system pref. addons.register('theme-switcher', api => { diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fa14481f5e7..66d25f1e189 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,7 +48,7 @@ Lastly, please follow the pull request template when submitting a pull request! All third-party contributions to this project must be accompanied by a signed contributor license agreement. This gives Adobe permission to redistribute your contributions as part of the project. [Sign our CLA](https://opensource.adobe.com/cla.html). You only need to submit an Adobe CLA one time, so if you have submitted one previously, you are good to go! ## Where to start -There are many places to dive into react-spectrum to help out. Before you take on a feature or issue, make sure you become familiar with [our architecture](architecture.html). +There are many places to dive into react-spectrum to help out. Before you take on a feature or issue, make sure you become familiar with [our architecture](https://react-spectrum.adobe.com/architecture.html). If you are looking for place to start, consider the following options: - Look for issues tagged with help wanted and/or good first issue. @@ -77,6 +77,32 @@ Or run the documentation and browse to [http://localhost:1234/](http://localhost yarn start:docs ``` +### Component/Hook scaffolding +If you are looking to contribute a brand new component or Hook in a package that does not exist yet, please run the following command. +```bash +yarn plop +``` +This will start a series of cli prompts to determine what template files and folders should be generated to help quick start your contribution. +The prompts are as follows: + +1. What type of project are you setting up? + - Select "React Spectrum v3" + +2. Scope name(s) + - Select the package scopes that make sense for your contribution (e.g. react-spectrum if you are contributing a component, react-aria for an aria Hook, etc) + +3. Package name, all lowercase (e.g. textfield) + +4. Component name, please use appropriate uppercase (e.g. TextField) + - If you are contributing a non-component Hook, just enter the name of your Hook. + +5. Component css module name, blank if N/A. If unsure, check @adobe/spectrum-css-temp/components for a module containing the desired css (e.g. textfield) + - If you cannot find the component CSS module name in @adobe/spectrum-css-temp/components, feel free to reach out to a team member via GitHub Issues or Discussions. + +Upon answering all the prompts, the appropriate package(s) should be generated and ready for modification. + +**Note:** With regards to the generated docs files, please feel free to remove them if you won't be contributing docs. If you are contributing docs for a new component or Hook, please submit them in a separate pull request so that we can decide when to deploy them to our docs site. + ### Tests We use [jest](https://jestjs.io/) for unit tests and [react-testing-library](https://testing-library.com/docs/react-testing-library/intro) for rendering and writing assertions. Please make sure you include tests with your pull requests. Our CI will run the tests on PRs as well as the linter and type checker. You can see on each PR whether you have passed all our checks. We split the tests into 2 groups. diff --git a/NOTICE.txt b/NOTICE.txt index 75ce1d748b8..63782c099d6 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -127,3 +127,90 @@ This codebase contains a portion of code that vuejs adapted from jest-dom which * https://github.com/testing-library/jest-dom/blob/main/LICENSE ------------------------------------------------------------------------------ +This codebase contains a modified portion of code from ICU which can be obtained at: + * SOURCE: + * https://github.com/unicode-org/icu + + * LICENSE: + COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + + Copyright © 1991-2020 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that either + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, or + (b) this copyright and permission notice appear in associated + Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. + +------------------------------------------------------------------------------- +This codebase contains a modified portion of code from the TC39 Temporal proposal which can be obtained at: + * SOURCE: + * https://github.com/tc39/proposal-temporal + + * LICENSE: + Copyright (c) 2017, 2018, 2019, 2020 + Ecma International. All rights reserved. + + All Software contained in this document ("Software") is protected by copyright + and is being made available under the "BSD License", included below. + + This Software may be subject to third party rights (rights from parties other + than Ecma International), including patent rights, and no licenses under such + third party rights are granted under this license even if the third party + concerned is a member of Ecma International. + + SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT + https://ecma-international.org/memento/codeofconduct.htm + FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO + IMPLEMENT ECMA INTERNATIONAL STANDARDS. + + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the authors nor Ecma International may be used to + endorse or promote products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. diff --git a/package.json b/package.json index 3cfc55ff25f..74379e72b88 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "start:docs": "PARCEL_WORKER_BACKEND=process DOCS_ENV=dev parcel 'packages/@react-{spectrum,aria,stately}/*/docs/*.mdx' 'packages/dev/docs/pages/**/*.mdx'", "build:docs": "PARCEL_WORKER_BACKEND=process DOCS_ENV=staging parcel build 'packages/@react-{spectrum,aria,stately}/*/docs/*.mdx' 'packages/dev/docs/pages/**/*.mdx' --no-scope-hoist", "test": "yarn jest", + "build": "make build", "test:ssr": "yarn jest --config jest.ssr.config.js", "ci-test": "yarn jest --maxWorkers=2 && yarn test:ssr --runInBand", "ci-test-17": "yarn jest --maxWorkers=2 && yarn test:ssr --runInBand", @@ -37,7 +38,11 @@ "chromatic": "chromatic --project-token 'q5msektqrfg' --build-script-name 'build:chromatic'", "merge:css": "babel-node --presets @babel/env ./scripts/merge-spectrum-css.js", "release": "lerna publish from-package --yes", - "publish:nightly": "lerna publish -y --canary --preid nightly --dist-tag=nightly --exact --force-publish=* --no-push" + "publish:nightly": "lerna publish -y --canary --preid nightly --dist-tag=nightly --exact --force-publish=* --no-push", + "build:api-published": "node scripts/buildPublishedAPI.js", + "build:api-branch": "node scripts/buildBranchAPI.js", + "compare:apis": "node scripts/compareAPIs.js", + "check-apis": "yarn build:api-published && yarn build:api-branch && yarn compare:apis" }, "workspaces": [ "packages/react-stately", @@ -78,9 +83,9 @@ "@storybook/addon-knobs": "^6.1.10", "@storybook/addon-links": "^6.1.10", "@storybook/react": "^6.1.10", - "@testing-library/dom": "^7.23.0", + "@testing-library/dom": "^8.0.0", "@testing-library/jest-dom": "^5.11.4", - "@testing-library/react": "^11.0.4", + "@testing-library/react": "^12.0.0", "@testing-library/react-hooks": "^3.4.1", "@testing-library/user-event": "^12.1.3", "@types/react": "^16.9.23", @@ -115,6 +120,7 @@ "eslint-plugin-rulesdir": "^0.1.0", "fast-glob": "^3.1.0", "file-loader": "^0.9.0", + "fs-extra": "^10.0.0", "full-icu": "^1.3.0", "identity-obj-proxy": "^3.0.0", "ignore-styles": "^5.0.1", @@ -122,6 +128,7 @@ "jest-junit": "^12.0.0", "jest-matchmedia-mock": "^1.0.0", "jsdom": "^16.3.0", + "json-diff-ts": "^1.1.0", "lerna": "^3.13.2", "lfcdn": "^0.4.2", "md5": "^2.2.1", @@ -158,6 +165,7 @@ "tempy": "^0.5.0", "typescript": "^3.8.3", "url-loader": "^1.1.2", + "walk-object": "^4.0.0", "webpack": "^4.44.2", "webpack-dev-middleware": "^3.6.1", "webpack-hot-middleware": "^2.24.3", diff --git a/packages/@adobe/react-spectrum/package.json b/packages/@adobe/react-spectrum/package.json index f9ac02834e8..f216c798893 100644 --- a/packages/@adobe/react-spectrum/package.json +++ b/packages/@adobe/react-spectrum/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/react-spectrum", - "version": "3.11.0", + "version": "3.13.0", "description": "Spectrum UI components in React", "license": "Apache-2.0", "main": "dist/main.js", @@ -19,48 +19,53 @@ "url": "https://github.com/adobe/react-spectrum" }, "dependencies": { - "@react-aria/i18n": "^3.3.1", - "@react-aria/ssr": "^3.0.2", - "@react-aria/visually-hidden": "^3.2.2", - "@react-spectrum/actiongroup": "^3.2.0", - "@react-spectrum/breadcrumbs": "^3.2.2", - "@react-spectrum/button": "^3.5.0", - "@react-spectrum/buttongroup": "^3.2.1", - "@react-spectrum/checkbox": "^3.2.3", - "@react-spectrum/dialog": "^3.3.2", - "@react-spectrum/divider": "^3.1.2", - "@react-spectrum/form": "^3.2.2", - "@react-spectrum/icon": "^3.3.1", - "@react-spectrum/illustratedmessage": "^3.1.2", - "@react-spectrum/image": "^3.1.2", - "@react-spectrum/layout": "^3.2.0", - "@react-spectrum/link": "^3.1.2", - "@react-spectrum/listbox": "^3.4.3", - "@react-spectrum/menu": "^3.3.0", - "@react-spectrum/meter": "^3.1.2", - "@react-spectrum/numberfield": "^3.0.0", - "@react-spectrum/overlays": "^3.4.2", - "@react-spectrum/picker": "^3.2.4", - "@react-spectrum/progress": "^3.1.2", - "@react-spectrum/provider": "^3.2.0", - "@react-spectrum/radio": "^3.1.3", - "@react-spectrum/searchfield": "^3.1.4", - "@react-spectrum/slider": "^3.0.3", - "@react-spectrum/statuslight": "^3.2.1", - "@react-spectrum/switch": "^3.1.2", - "@react-spectrum/tabs": "^3.0.0", - "@react-spectrum/text": "^3.1.2", - "@react-spectrum/textfield": "^3.1.6", - "@react-spectrum/theme-dark": "^3.2.1", - "@react-spectrum/theme-default": "^3.2.1", - "@react-spectrum/theme-light": "^3.1.1", - "@react-spectrum/tooltip": "^3.1.3", - "@react-spectrum/view": "^3.1.2", - "@react-spectrum/well": "^3.1.2", - "@react-stately/collections": "^3.3.2", - "@react-stately/data": "^3.4.0" + "@react-aria/i18n": "^3.3.2", + "@react-aria/ssr": "^3.0.3", + "@react-aria/visually-hidden": "^3.2.3", + "@react-spectrum/actiongroup": "^3.2.2", + "@react-spectrum/breadcrumbs": "^3.2.3", + "@react-spectrum/button": "^3.5.1", + "@react-spectrum/buttongroup": "^3.2.2", + "@react-spectrum/checkbox": "^3.2.4", + "@react-spectrum/combobox": "^3.0.1", + "@react-spectrum/dialog": "^3.3.3", + "@react-spectrum/divider": "^3.1.3", + "@react-spectrum/form": "^3.2.3", + "@react-spectrum/icon": "^3.3.2", + "@react-spectrum/illustratedmessage": "^3.1.3", + "@react-spectrum/image": "^3.1.3", + "@react-spectrum/layout": "^3.2.1", + "@react-spectrum/link": "^3.1.3", + "@react-spectrum/listbox": "^3.5.1", + "@react-spectrum/menu": "^3.4.0", + "@react-spectrum/meter": "^3.1.3", + "@react-spectrum/numberfield": "^3.0.1", + "@react-spectrum/overlays": "^3.4.4", + "@react-spectrum/picker": "^3.3.1", + "@react-spectrum/progress": "^3.1.3", + "@react-spectrum/provider": "^3.2.2", + "@react-spectrum/radio": "^3.1.4", + "@react-spectrum/searchfield": "^3.1.5", + "@react-spectrum/slider": "^3.0.4", + "@react-spectrum/statuslight": "^3.2.2", + "@react-spectrum/switch": "^3.1.3", + "@react-spectrum/tabs": "^3.0.2", + "@react-spectrum/text": "^3.1.3", + "@react-spectrum/textfield": "^3.1.7", + "@react-spectrum/theme-dark": "^3.2.2", + "@react-spectrum/theme-default": "^3.2.2", + "@react-spectrum/theme-light": "^3.1.2", + "@react-spectrum/tooltip": "^3.1.4", + "@react-spectrum/view": "^3.1.3", + "@react-spectrum/well": "^3.1.3", + "@react-stately/collections": "^3.3.3", + "@react-stately/data": "^3.4.1" }, "publishConfig": { "access": "public" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1" } } diff --git a/packages/@adobe/react-spectrum/src/index.ts b/packages/@adobe/react-spectrum/src/index.ts index 1d2356b3d5b..d51f433b115 100644 --- a/packages/@adobe/react-spectrum/src/index.ts +++ b/packages/@adobe/react-spectrum/src/index.ts @@ -15,6 +15,7 @@ export {Breadcrumbs} from '@react-spectrum/breadcrumbs'; export {ActionButton, Button, LogicButton, ToggleButton} from '@react-spectrum/button'; export {ButtonGroup} from '@react-spectrum/buttongroup'; export {Checkbox, CheckboxGroup} from '@react-spectrum/checkbox'; +export {ComboBox} from '@react-spectrum/combobox'; export {AlertDialog, Dialog, DialogTrigger, DialogContainer, useDialogContainer} from '@react-spectrum/dialog'; export {Divider} from '@react-spectrum/divider'; export {Form} from '@react-spectrum/form'; diff --git a/packages/@adobe/spectrum-css-temp/components/avatar/skin.css b/packages/@adobe/spectrum-css-temp/components/avatar/skin.css index 9d611fcfd44..a7b3ca51811 100644 --- a/packages/@adobe/spectrum-css-temp/components/avatar/skin.css +++ b/packages/@adobe/spectrum-css-temp/components/avatar/skin.css @@ -12,6 +12,8 @@ governing permissions and limitations under the License. .spectrum-Avatar { opacity: var(--spectrum-avatar-small-opacity); + outline: none; + transition: box-shadow var(--spectrum-global-animation-duration-100) ease-out; &.is-disabled { opacity: var(--spectrum-avatar-small-opacity-disabled); diff --git a/packages/@adobe/spectrum-css-temp/components/fieldlabel/index.css b/packages/@adobe/spectrum-css-temp/components/fieldlabel/index.css index 1213d456434..796a8a6a328 100644 --- a/packages/@adobe/spectrum-css-temp/components/fieldlabel/index.css +++ b/packages/@adobe/spectrum-css-temp/components/fieldlabel/index.css @@ -58,7 +58,7 @@ governing permissions and limitations under the License. text-align: end; /* labelPosition=side case */ } -/* A Field is a wrapper for a FieldLabel and a field component (e.g. textfield). +/* A Field is a wrapper for a FieldLabel, a field component (e.g. textfield), and a HelpText. * By default, labels are placed above the field. Fields have a default width, and the * label will wrap within this width. The width of the whole field can be overridden by the user, * and this causes both the label and inner field to resize as well. */ @@ -86,8 +86,26 @@ governing permissions and limitations under the License. display: inline-flex; align-items: flex-start; + /* Wraps the field & help text, but not the label */ + .spectrum-Field-wrapper { + flex: 1; + /* Setting `flex: 1;` is equivalent to `flex: 1 1 0;`, which means we expect to be able to shrink + * To be able to shrink, we must have a min-width that isn't 'auto' */ + min-width: 0; + /* TODO: By default, vertical flex wrapper for `labelPosition: side` should have default field width. + * This is a workaround until we find a better way to set the width of the field & help text. + * Should default to form field's default width and and allow users to override with custom width. */ + width: var(--spectrum-field-default-width); + + .spectrum-Field-field { + /* If the user overrides the width of the field, propagate to the inner component */ + width: 100%; + } + } + .spectrum-Field-field { flex: 1; + min-width: 0; } .spectrum-Field-field--multiline { @@ -119,6 +137,10 @@ governing permissions and limitations under the License. display: table-cell; } + .spectrum-Field-wrapper { + width: 100%; + } + .spectrum-Field-field { display: table-cell; width: auto; diff --git a/packages/@adobe/spectrum-css-temp/components/helptext/index.css b/packages/@adobe/spectrum-css-temp/components/helptext/index.css new file mode 100644 index 00000000000..5b578d497ea --- /dev/null +++ b/packages/@adobe/spectrum-css-temp/components/helptext/index.css @@ -0,0 +1,61 @@ +/* + * Copyright 2021 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +@import '../commons/index.css'; + +:root { + --spectrum-helptext-neutral-texticon-text-size: var(--spectrum-global-dimension-font-size-75); + --spectrum-helptext-neutral-texticon-icon-gap: var(--spectrum-global-dimension-size-100); + + --spectrum-helptext-negative-texticon-icon-padding-top: var(--spectrum-global-dimension-size-40); + --spectrum-helptext-negative-texticon-icon-padding-bottom: var(--spectrum-global-dimension-size-40); + + --spectrum-helptext-neutral-textonly-text-padding-top: var(--spectrum-global-dimension-static-size-50); + --spectrum-helptext-neutral-textonly-text-transform: none; + --spectrum-helptext-neutral-textonly-text-letter-spacing: var(--spectrum-global-font-letter-spacing-none); + + /* Uses value for DNA variable --spectrum-helptext-l-neutral-textonly-text-padding-bottom, since m variant doesn't exist */ + --spectrum-helptext-neutral-textonly-text-padding-bottom: var(--spectrum-global-dimension-size-115); + /* Override: DNA uses --spectrum-alias-component-text-line-height */ + --spectrum-helptext-neutral-textonly-text-line-height: var(--spectrum-global-font-line-height-small); +} + +.spectrum-HelpText { + display: flex; + font-size: var(--spectrum-helptext-neutral-texticon-text-size); + .spectrum-HelpText-validationIcon { + margin-inline-end: var(--spectrum-helptext-neutral-texticon-icon-gap); + padding-block: var(--spectrum-helptext-negative-texticon-icon-padding-top) var(--spectrum-helptext-negative-texticon-icon-padding-bottom); + flex-shrink: 0; + } + .spectrum-HelpText-text { + /* Not in DNA: make text fill up all horizontal space. */ + flex: 1; + + margin-inline-end: var(--spectrum-helptext-neutral-texticon-icon-gap); + padding-block: var(--spectrum-helptext-neutral-textonly-text-padding-top) var(--spectrum-helptext-neutral-textonly-text-padding-bottom); + line-height: var(--spectrum-helptext-neutral-textonly-text-line-height); + text-transform: var(--spectrum-helptext-neutral-textonly-text-transform); + letter-spacing: var(--spectrum-helptext-neutral-textonly-text-letter-spacing); + } + /* Not in DNA */ + &.spectrum-HelpText--alignEnd { + text-align: end; /* Works with labelPosition=top and labelPosition=side */ + .spectrum-HelpText-text { + margin-inline-end: 0; + margin-inline-start: var(--spectrum-helptext-neutral-texticon-icon-gap); + } + .spectrum-HelpText-validationIcon { + margin-inline-end: 0; + } + } +} diff --git a/packages/@adobe/spectrum-css-temp/components/helptext/skin.css b/packages/@adobe/spectrum-css-temp/components/helptext/skin.css new file mode 100644 index 00000000000..b24de1efea3 --- /dev/null +++ b/packages/@adobe/spectrum-css-temp/components/helptext/skin.css @@ -0,0 +1,41 @@ +/* + * Copyright 2021 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +:root { + --spectrum-helptext-neutral-texticon-text-color: var(--spectrum-alias-label-text-color); + --spectrum-helptext-neutral-texticon-text-color-disabled: var(--spectrum-alias-text-color-disabled); + + /* Override: DNA uses --spectrum-semantic-negative-text-color-small */ + --spectrum-helptext-negative-texticon-text-color: var(--spectrum-semantic-negative-color-text-small); + /* Override: DNA uses --spectrum-semantic-negative-icon-color */ + --spectrum-helptext-negative-texticon-icon-color: var(--spectrum-semantic-negative-color-text-small); +} + +.spectrum-HelpText--neutral { + .spectrum-HelpText-text { + color: var(--spectrum-helptext-neutral-texticon-text-color); + } + &.is-disabled { + .spectrum-HelpText-text { + color: var(--spectrum-helptext-neutral-texticon-text-color-disabled); + } + } +} + +.spectrum-HelpText--negative { + .spectrum-HelpText-validationIcon { + color: var(--spectrum-helptext-negative-texticon-icon-color); + } + .spectrum-HelpText-text { + color: var(--spectrum-helptext-negative-texticon-text-color); + } +} diff --git a/packages/@adobe/spectrum-css-temp/components/helptext/vars.css b/packages/@adobe/spectrum-css-temp/components/helptext/vars.css new file mode 100644 index 00000000000..f0681ac2aaf --- /dev/null +++ b/packages/@adobe/spectrum-css-temp/components/helptext/vars.css @@ -0,0 +1,14 @@ +/* + * Copyright 2021 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +@import './index.css'; +@import './skin.css'; diff --git a/packages/@adobe/spectrum-css-temp/components/inputgroup/index.css b/packages/@adobe/spectrum-css-temp/components/inputgroup/index.css index 42a391d9357..b472d09da09 100644 --- a/packages/@adobe/spectrum-css-temp/components/inputgroup/index.css +++ b/packages/@adobe/spectrum-css-temp/components/inputgroup/index.css @@ -44,7 +44,8 @@ governing permissions and limitations under the License. flex-shrink: 0; } - &.is-disabled { + /* Quiet or invalid inputgroup field button should always have a border width. */ + &.is-disabled:not(.spectrum-InputGroup--invalid):not(.spectrum-InputGroup--quiet) { .spectrum-FieldButton { border-width: 0; } @@ -160,7 +161,7 @@ governing permissions and limitations under the License. } } .spectrum-Datepicker-endField { - .spectrum-InputGroup-field { + .spectrum-InputGroup-input { flex: 1; border-inline-start: 0; border-radius: 0; diff --git a/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css b/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css index f0383e3ff11..5e533ca2870 100644 --- a/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css +++ b/packages/@adobe/spectrum-css-temp/components/inputgroup/skin.css @@ -72,6 +72,19 @@ governing permissions and limitations under the License. } .spectrum-InputGroup--quiet { + /* + specifically for readonly inputgroups that aren't disabled since the button will have the disabled class + but we don't want the border color to be the disabled quiet one + */ + &:not(.is-disabled) { + .spectrum-FieldButton { + &:disabled, + &:disabled:hover { + border-color: var(--spectrum-textfield-quiet-border-color); + } + } + } + .spectrum-FieldButton { &, &:hover, @@ -79,10 +92,13 @@ governing permissions and limitations under the License. &:active, &.is-selected, &:invalid, - &.spectrum-FieldButton--invalid, + &.spectrum-FieldButton--invalid { + border-color: var(--spectrum-textfield-quiet-border-color); + } + &:disabled, &:disabled:hover { - border-color: var(--spectrum-textfield-quiet-border-color); + border-color: var(--spectrum-textfield-quiet-border-color-disabled); } } diff --git a/packages/@adobe/spectrum-css-temp/components/menu/index.css b/packages/@adobe/spectrum-css-temp/components/menu/index.css index 9fd32a36c23..8b5fa4a638e 100644 --- a/packages/@adobe/spectrum-css-temp/components/menu/index.css +++ b/packages/@adobe/spectrum-css-temp/components/menu/index.css @@ -110,7 +110,7 @@ governing permissions and limitations under the License. .spectrum-Menu-itemLabel { grid-area: text; line-height: var(--spectrum-global-font-line-height-small); - word-break: break-all; + word-break: break-word; } .spectrum-Menu-itemLabel--wrapping { diff --git a/packages/@adobe/spectrum-css-temp/components/searchwithin/index.css b/packages/@adobe/spectrum-css-temp/components/searchwithin/index.css index af77d36aa56..7e3f7742bd5 100644 --- a/packages/@adobe/spectrum-css-temp/components/searchwithin/index.css +++ b/packages/@adobe/spectrum-css-temp/components/searchwithin/index.css @@ -11,49 +11,66 @@ governing permissions and limitations under the License. */ @import '../commons/index.css'; - -:root { - --spectrum-searchwithin-width: 250px; +.spectrum-SearchWithin { + --spectrum-searchwithin-width: var(--spectrum-global-dimension-size-3000); + --spectrum-searchwithin-searchfield-width: var(--spectrum-global-dimension-size-1600); /* Force override */ --spectrum-searchwithin-border-radius: 0; - --spectrum-searchwithin-dropdown-min-width: 0; + --spectrum-searchwithin-picker-min-width: 0; } .spectrum-SearchWithin { - width: var(--spectrum-searchwithin-width); + inline-size: var(--spectrum-searchwithin-width); + min-inline-size: var(--spectrum-searchwithin-width); display: inline-flex; position: relative; +} - .spectrum-Dropdown { - width: auto; - min-width: 0; - } +.spectrum-SearchWithin-picker { + inline-size: auto; + min-inline-size: var(--spectrum-global-dimension-size-900); + flex-shrink: 0; - .spectrum-Dropdown-trigger { - border-top-right-radius: var(--spectrum-searchwithin-border-radius); - border-bottom-right-radius: var(--spectrum-searchwithin-border-radius); + > button { + contain: unset; + border-end-start-radius: var(--spectrum-searchwithin-border-radius); + border-start-start-radius: var(--spectrum-searchwithin-border-radius); } +} + +.spectrum-SearchWithin-searchfield { + min-inline-size: var(--spectrum-searchwithin-searchfield-width); + flex-grow: 1; + order: -1; + margin-inline-end: calc( + -1 * var(--spectrum-textfield-border-size) + ); /* hides right border */ - .spectrum-Dropdown-label { - /* Override dropdown's min-width and be tiny */ - min-width: var(--spectrum-searchwithin-dropdown-min-width); + &:focus-within { + z-index: 1; /* shows entire focus ring */ } - .spectrum-Textfield { + > input { + border-end-end-radius: var(--spectrum-searchwithin-border-radius); + border-start-end-radius: var(--spectrum-searchwithin-border-radius); flex: 1; - margin-left: calc(var(--spectrum-textfield-border-size) * -1); /* hides left border */ - border-top-left-radius: var(--spectrum-searchwithin-border-radius); - border-bottom-left-radius: var(--spectrum-searchwithin-border-radius); + box-sizing: border-box; + min-inline-size: inherit; - &:hover, &:focus { - position: relative; /* shows left border */ + &:hover, + &:focus { + position: relative; /* shows right border */ } } +} - .spectrum-ClearButton { - position: absolute; - top: 0; - right: 0; +/* this is specific to handling default width */ +.spectrum-SearchWithin-container { + /* ensure we have higher specificity than .spectrum-Field */ + &.spectrum-SearchWithin-container { + /* override the default width of the field container, only with labelPosition=top. */ + --spectrum-field-default-width: var(--spectrum-global-dimension-size-3000); + min-inline-size: var(--spectrum-global-dimension-size-3000); } } diff --git a/packages/@adobe/spectrum-css-temp/components/table/index.css b/packages/@adobe/spectrum-css-temp/components/table/index.css index 7383757f46a..bec5a67260c 100644 --- a/packages/@adobe/spectrum-css-temp/components/table/index.css +++ b/packages/@adobe/spectrum-css-temp/components/table/index.css @@ -34,6 +34,13 @@ governing permissions and limitations under the License. transition: transform var(--spectrum-global-animation-duration-100) ease-in-out; } +.spectrum-Table-headWrapper { + border-left-width: 1px; + border-left-style: solid; + border-right-width: 1px; + border-right-style: solid; +} + .spectrum-Table-headCell { box-sizing: border-box; font-size: var(--spectrum-table-header-text-size); @@ -150,6 +157,10 @@ governing permissions and limitations under the License. } .spectrum-Table-cellContents { + flex: 1 1 0%; + /* To ensure the flex child only takes up available width, see https://makandracards.com/makandra/66994-css-flex-and-min-width */ + min-width: 0px; + /* truncate text with ellipsis */ overflow: hidden; white-space: nowrap; @@ -251,6 +262,11 @@ governing permissions and limitations under the License. } .spectrum-Table--quiet { + .spectrum-Table-headWrapper { + border-left: 0; + border-right: 0; + } + .spectrum-Table-body { border-radius: var(--spectrum-table-quiet-border-radius); } @@ -272,6 +288,10 @@ governing permissions and limitations under the License. padding-top: 0px; padding-bottom: 0px; vertical-align: var(--spectrum-table-cell-checkbox-vertical-alignment); + + .spectrum-Table-checkbox { + padding-inline-end: 0px; + } } .spectrum-Table-checkbox { diff --git a/packages/@adobe/spectrum-css-temp/components/table/skin.css b/packages/@adobe/spectrum-css-temp/components/table/skin.css index bcb23e07c09..4e86906cc7b 100644 --- a/packages/@adobe/spectrum-css-temp/components/table/skin.css +++ b/packages/@adobe/spectrum-css-temp/components/table/skin.css @@ -10,6 +10,11 @@ OF ANY KIND, either express or implied. See the License for the specific languag governing permissions and limitations under the License. */ +.spectrum-Table-headWrapper { + border-left-color: transparent; + border-right-color: transparent; +} + .spectrum-Table-headCell { color: var(--spectrum-table-header-text-color); background-color: var(--spectrum-alias-background-color-default); diff --git a/packages/@adobe/spectrum-css-temp/vars/spectrum-global.css b/packages/@adobe/spectrum-css-temp/vars/spectrum-global.css index 52d275fbb10..bee72bde0c2 100644 --- a/packages/@adobe/spectrum-css-temp/vars/spectrum-global.css +++ b/packages/@adobe/spectrum-css-temp/vars/spectrum-global.css @@ -451,6 +451,12 @@ --spectrum-alias-heading-xxs-text-size: var(--spectrum-global-dimension-font-size-100); --spectrum-alias-heading6-margin-top: var(--spectrum-global-dimension-font-size-75); --spectrum-alias-heading-xxs-margin-top: var(--spectrum-global-dimension-font-size-75); + --spectrum-alias-avatar-size-50: var(--spectrum-global-dimension-size-200); + --spectrum-alias-avatar-size-75: var(--spectrum-global-dimension-size-225); + --spectrum-alias-avatar-size-200: var(--spectrum-global-dimension-size-275); + --spectrum-alias-avatar-size-300: var(--spectrum-global-dimension-size-325); + --spectrum-alias-avatar-size-500: var(--spectrum-global-dimension-size-400); + --spectrum-alias-avatar-size-700: var(--spectrum-global-dimension-size-500); } .spectrum--darkest, diff --git a/packages/@adobe/spectrum-css-temp/vars/spectrum-large.css b/packages/@adobe/spectrum-css-temp/vars/spectrum-large.css index fc3294f747e..31c5123610e 100644 --- a/packages/@adobe/spectrum-css-temp/vars/spectrum-large.css +++ b/packages/@adobe/spectrum-css-temp/vars/spectrum-large.css @@ -30,7 +30,9 @@ --spectrum-global-dimension-size-200: 20px; --spectrum-global-dimension-size-225: 22px; --spectrum-global-dimension-size-250: 25px; + --spectrum-global-dimension-size-275: 28px; --spectrum-global-dimension-size-300: 30px; + --spectrum-global-dimension-size-325: 32px; --spectrum-global-dimension-size-350: 35px; --spectrum-global-dimension-size-400: 40px; --spectrum-global-dimension-size-450: 45px; @@ -71,6 +73,9 @@ --spectrum-global-dimension-font-size-1100: 55px; --spectrum-global-dimension-font-size-1200: 62px; --spectrum-global-dimension-font-size-1300: 70px; + --spectrum-alias-avatar-size-100: 26px; + --spectrum-alias-avatar-size-400: 36px; + --spectrum-alias-avatar-size-600: 46px; --spectrum-actionbutton-touch-hit-x: var(--spectrum-global-dimension-static-size-50); --spectrum-actionbutton-touch-hit-y: var(--spectrum-global-dimension-static-size-50); --spectrum-actionbutton-emphasized-touch-hit-x: var(--spectrum-global-dimension-static-size-50); diff --git a/packages/@adobe/spectrum-css-temp/vars/spectrum-medium.css b/packages/@adobe/spectrum-css-temp/vars/spectrum-medium.css index 7855b2be5a6..586e112f04a 100644 --- a/packages/@adobe/spectrum-css-temp/vars/spectrum-medium.css +++ b/packages/@adobe/spectrum-css-temp/vars/spectrum-medium.css @@ -30,7 +30,9 @@ --spectrum-global-dimension-size-200: 16px; --spectrum-global-dimension-size-225: 18px; --spectrum-global-dimension-size-250: 20px; + --spectrum-global-dimension-size-275: 22px; --spectrum-global-dimension-size-300: 24px; + --spectrum-global-dimension-size-325: 26px; --spectrum-global-dimension-size-350: 28px; --spectrum-global-dimension-size-400: 32px; --spectrum-global-dimension-size-450: 36px; @@ -71,6 +73,9 @@ --spectrum-global-dimension-font-size-1100: 45px; --spectrum-global-dimension-font-size-1200: 50px; --spectrum-global-dimension-font-size-1300: 60px; + --spectrum-alias-avatar-size-100: var(--spectrum-global-dimension-size-250); + --spectrum-alias-avatar-size-400: var(--spectrum-global-dimension-size-350); + --spectrum-alias-avatar-size-600: var(--spectrum-global-dimension-size-450); --spectrum-actionbutton-touch-hit-x: var(--spectrum-global-dimension-static-size-100); --spectrum-actionbutton-touch-hit-y: var(--spectrum-global-dimension-static-size-100); --spectrum-actionbutton-emphasized-touch-hit-x: var(--spectrum-global-dimension-static-size-100); diff --git a/packages/@internationalized/date/README.md b/packages/@internationalized/date/README.md new file mode 100644 index 00000000000..e046718fbe9 --- /dev/null +++ b/packages/@internationalized/date/README.md @@ -0,0 +1,3 @@ +# @internationalized/date + +This package is part of [react-spectrum](https://github.com/adobe/react-spectrum). See the repo for more details. diff --git a/packages/@internationalized/date/index.ts b/packages/@internationalized/date/index.ts new file mode 100644 index 00000000000..1210ae1e402 --- /dev/null +++ b/packages/@internationalized/date/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +export * from './src'; diff --git a/packages/@internationalized/date/package.json b/packages/@internationalized/date/package.json new file mode 100644 index 00000000000..99f977adfa6 --- /dev/null +++ b/packages/@internationalized/date/package.json @@ -0,0 +1,25 @@ +{ + "name": "@internationalized/date", + "version": "3.0.0-alpha.1", + "description": "Internationalized calendar and date manipulation utilities", + "license": "Apache-2.0", + "private": true, + "main": "dist/main.js", + "module": "dist/module.js", + "types": "dist/types.d.ts", + "source": "src/index.ts", + "files": [ + "dist" + ], + "sideEffects": false, + "repository": { + "type": "git", + "url": "https://github.com/adobe/react-spectrum" + }, + "dependencies": { + "@babel/runtime": "^7.6.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/@internationalized/date/scripts/generate-umalqura.js b/packages/@internationalized/date/scripts/generate-umalqura.js new file mode 100644 index 00000000000..50fe9839107 --- /dev/null +++ b/packages/@internationalized/date/scripts/generate-umalqura.js @@ -0,0 +1,169 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Copied from ICU's IslamicCalendar.java +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +const UMALQURA_MONTHLENGTH = [ + //* 1300 -1302 */ + // "1010 1010 1010", "1101 0101 0100", "1110 1100 1001", + 0x0AAA, 0x0D54, 0x0EC9, + //* 1303 -1307 */ + // "0110 1101 0100", "0110 1110 1010", "0011 0110 1100", "1010 1010 1101", "0101 0101 0101", + 0x06D4, 0x06EA, 0x036C, 0x0AAD, 0x0555, + //* 1308 -1312 */ + // "0110 1010 1001", "0111 1001 0010", "1011 1010 1001", "0101 1101 0100", "1010 1101 1010", + 0x06A9, 0x0792, 0x0BA9, 0x05D4, 0x0ADA, + //* 1313 -1317 */ + // "0101 0101 1100", "1101 0010 1101", "0110 1001 0101", "0111 0100 1010", "1011 0101 0100", + 0x055C, 0x0D2D, 0x0695, 0x074A, 0x0B54, + //* 1318 -1322 */ + // "1011 0110 1010", "0101 1010 1101", "0100 1010 1110", "1010 0100 1111", "0101 0001 0111", + 0x0B6A, 0x05AD, 0x04AE, 0x0A4F, 0x0517, + //* 1323 -1327 */ + // "0110 1000 1011", "0110 1010 0101", "1010 1101 0101", "0010 1101 0110", "1001 0101 1011", + 0x068B, 0x06A5, 0x0AD5, 0x02D6, 0x095B, + //* 1328 -1332 */ + // "0100 1001 1101", "1010 0100 1101", "1101 0010 0110", "1101 1001 0101", "0101 1010 1100", + 0x049D, 0x0A4D, 0x0D26, 0x0D95, 0x05AC, + //* 1333 -1337 */ + // "1001 1011 0110", "0010 1011 1010", "1010 0101 1011", "0101 0010 1011", "1010 1001 0101", + 0x09B6, 0x02BA, 0x0A5B, 0x052B, 0x0A95, + //* 1338 -1342 */ + // "0110 1100 1010", "1010 1110 1001", "0010 1111 0100", "1001 0111 0110", "0010 1011 0110", + 0x06CA, 0x0AE9, 0x02F4, 0x0976, 0x02B6, + //* 1343 -1347 */ + // "1001 0101 0110", "1010 1100 1010", "1011 1010 0100", "1011 1101 0010", "0101 1101 1001", + 0x0956, 0x0ACA, 0x0BA4, 0x0BD2, 0x05D9, + //* 1348 -1352 */ + // "0010 1101 1100", "1001 0110 1101", "0101 0100 1101", "1010 1010 0101", "1011 0101 0010", + 0x02DC, 0x096D, 0x054D, 0x0AA5, 0x0B52, + //* 1353 -1357 */ + // "1011 1010 0101", "0101 1011 0100", "1001 1011 0110", "0101 0101 0111", "0010 1001 0111", + 0x0BA5, 0x05B4, 0x09B6, 0x0557, 0x0297, + //* 1358 -1362 */ + // "0101 0100 1011", "0110 1010 0011", "0111 0101 0010", "1011 0110 0101", "0101 0110 1010", + 0x054B, 0x06A3, 0x0752, 0x0B65, 0x056A, + //* 1363 -1367 */ + // "1010 1010 1011", "0101 0010 1011", "1100 1001 0101", "1101 0100 1010", "1101 1010 0101", + 0x0AAB, 0x052B, 0x0C95, 0x0D4A, 0x0DA5, + //* 1368 -1372 */ + // "0101 1100 1010", "1010 1101 0110", "1001 0101 0111", "0100 1010 1011", "1001 0100 1011", + 0x05CA, 0x0AD6, 0x0957, 0x04AB, 0x094B, + //* 1373 -1377 */ + // "1010 1010 0101", "1011 0101 0010", "1011 0110 1010", "0101 0111 0101", "0010 0111 0110", + 0x0AA5, 0x0B52, 0x0B6A, 0x0575, 0x0276, + //* 1378 -1382 */ + // "1000 1011 0111", "0100 0101 1011", "0101 0101 0101", "0101 1010 1001", "0101 1011 0100", + 0x08B7, 0x045B, 0x0555, 0x05A9, 0x05B4, + //* 1383 -1387 */ + // "1001 1101 1010", "0100 1101 1101", "0010 0110 1110", "1001 0011 0110", "1010 1010 1010", + 0x09DA, 0x04DD, 0x026E, 0x0936, 0x0AAA, + //* 1388 -1392 */ + // "1101 0101 0100", "1101 1011 0010", "0101 1101 0101", "0010 1101 1010", "1001 0101 1011", + 0x0D54, 0x0DB2, 0x05D5, 0x02DA, 0x095B, + //* 1393 -1397 */ + // "0100 1010 1011", "1010 0101 0101", "1011 0100 1001", "1011 0110 0100", "1011 0111 0001", + 0x04AB, 0x0A55, 0x0B49, 0x0B64, 0x0B71, + //* 1398 -1402 */ + // "0101 1011 0100", "1010 1011 0101", "1010 0101 0101", "1101 0010 0101", "1110 1001 0010", + 0x05B4, 0x0AB5, 0x0A55, 0x0D25, 0x0E92, + //* 1403 -1407 */ + // "1110 1100 1001", "0110 1101 0100", "1010 1110 1001", "1001 0110 1011", "0100 1010 1011", + 0x0EC9, 0x06D4, 0x0AE9, 0x096B, 0x04AB, + //* 1408 -1412 */ + // "1010 1001 0011", "1101 0100 1001", "1101 1010 0100", "1101 1011 0010", "1010 1011 1001", + 0x0A93, 0x0D49, 0x0DA4, 0x0DB2, 0x0AB9, + //* 1413 -1417 */ + // "0100 1011 1010", "1010 0101 1011", "0101 0010 1011", "1010 1001 0101", "1011 0010 1010", + 0x04BA, 0x0A5B, 0x052B, 0x0A95, 0x0B2A, + //* 1418 -1422 */ + // "1011 0101 0101", "0101 0101 1100", "0100 1011 1101", "0010 0011 1101", "1001 0001 1101", + 0x0B55, 0x055C, 0x04BD, 0x023D, 0x091D, + //* 1423 -1427 */ + // "1010 1001 0101", "1011 0100 1010", "1011 0101 1010", "0101 0110 1101", "0010 1011 0110", + 0x0A95, 0x0B4A, 0x0B5A, 0x056D, 0x02B6, + //* 1428 -1432 */ + // "1001 0011 1011", "0100 1001 1011", "0110 0101 0101", "0110 1010 1001", "0111 0101 0100", + 0x093B, 0x049B, 0x0655, 0x06A9, 0x0754, + //* 1433 -1437 */ + // "1011 0110 1010", "0101 0110 1100", "1010 1010 1101", "0101 0101 0101", "1011 0010 1001", + 0x0B6A, 0x056C, 0x0AAD, 0x0555, 0x0B29, + //* 1438 -1442 */ + // "1011 1001 0010", "1011 1010 1001", "0101 1101 0100", "1010 1101 1010", "0101 0101 1010", + 0x0B92, 0x0BA9, 0x05D4, 0x0ADA, 0x055A, + //* 1443 -1447 */ + // "1010 1010 1011", "0101 1001 0101", "0111 0100 1001", "0111 0110 0100", "1011 1010 1010", + 0x0AAB, 0x0595, 0x0749, 0x0764, 0x0BAA, + //* 1448 -1452 */ + // "0101 1011 0101", "0010 1011 0110", "1010 0101 0110", "1110 0100 1101", "1011 0010 0101", + 0x05B5, 0x02B6, 0x0A56, 0x0E4D, 0x0B25, + //* 1453 -1457 */ + // "1011 0101 0010", "1011 0110 1010", "0101 1010 1101", "0010 1010 1110", "1001 0010 1111", + 0x0B52, 0x0B6A, 0x05AD, 0x02AE, 0x092F, + //* 1458 -1462 */ + // "0100 1001 0111", "0110 0100 1011", "0110 1010 0101", "0110 1010 1100", "1010 1101 0110", + 0x0497, 0x064B, 0x06A5, 0x06AC, 0x0AD6, + //* 1463 -1467 */ + // "0101 0101 1101", "0100 1001 1101", "1010 0100 1101", "1101 0001 0110", "1101 1001 0101", + 0x055D, 0x049D, 0x0A4D, 0x0D16, 0x0D95, + //* 1468 -1472 */ + // "0101 1010 1010", "0101 1011 0101", "0010 1101 1010", "1001 0101 1011", "0100 1010 1101", + 0x05AA, 0x05B5, 0x02DA, 0x095B, 0x04AD, + //* 1473 -1477 */ + // "0101 1001 0101", "0110 1100 1010", "0110 1110 0100", "1010 1110 1010", "0100 1111 0101", + 0x0595, 0x06CA, 0x06E4, 0x0AEA, 0x04F5, + //* 1478 -1482 */ + // "0010 1011 0110", "1001 0101 0110", "1010 1010 1010", "1011 0101 0100", "1011 1101 0010", + 0x02B6, 0x0956, 0x0AAA, 0x0B54, 0x0BD2, + //* 1483 -1487 */ + // "0101 1101 1001", "0010 1110 1010", "1001 0110 1101", "0100 1010 1101", "1010 1001 0101", + 0x05D9, 0x02EA, 0x096D, 0x04AD, 0x0A95, + //* 1488 -1492 */ + // "1011 0100 1010", "1011 1010 0101", "0101 1011 0010", "1001 1011 0101", "0100 1101 0110", + 0x0B4A, 0x0BA5, 0x05B2, 0x09B5, 0x04D6, + //* 1493 -1497 */ + // "1010 1001 0111", "0101 0100 0111", "0110 1001 0011", "0111 0100 1001", "1011 0101 0101", + 0x0A97, 0x0547, 0x0693, 0x0749, 0x0B55, + //* 1498 -1508 */ + // "0101 0110 1010", "1010 0110 1011", "0101 0010 1011", "1010 1000 1011", "1101 0100 0110", "1101 1010 0011", "0101 1100 1010", "1010 1101 0110", "0100 1101 1011", "0010 0110 1011", "1001 0100 1011", + 0x056A, 0x0A6B, 0x052B, 0x0A8B, 0x0D46, 0x0DA3, 0x05CA, 0x0AD6, 0x04DB, 0x026B, 0x094B, + //* 1509 -1519 */ + // "1010 1010 0101", "1011 0101 0010", "1011 0110 1001", "0101 0111 0101", "0001 0111 0110", "1000 1011 0111", "0010 0101 1011", "0101 0010 1011", "0101 0110 0101", "0101 1011 0100", "1001 1101 1010", + 0x0AA5, 0x0B52, 0x0B69, 0x0575, 0x0176, 0x08B7, 0x025B, 0x052B, 0x0565, 0x05B4, 0x09DA, + //* 1520 -1530 */ + // "0100 1110 1101", "0001 0110 1101", "1000 1011 0110", "1010 1010 0110", "1101 0101 0010", "1101 1010 1001", "0101 1101 0100", "1010 1101 1010", "1001 0101 1011", "0100 1010 1011", "0110 0101 0011", + 0x04ED, 0x016D, 0x08B6, 0x0AA6, 0x0D52, 0x0DA9, 0x05D4, 0x0ADA, 0x095B, 0x04AB, 0x0653, + //* 1531 -1541 */ + // "0111 0010 1001", "0111 0110 0010", "1011 1010 1001", "0101 1011 0010", "1010 1011 0101", "0101 0101 0101", "1011 0010 0101", "1101 1001 0010", "1110 1100 1001", "0110 1101 0010", "1010 1110 1001", + 0x0729, 0x0762, 0x0BA9, 0x05B2, 0x0AB5, 0x0555, 0x0B25, 0x0D92, 0x0EC9, 0x06D2, 0x0AE9, + //* 1542 -1552 */ + // "0101 0110 1011", "0100 1010 1011", "1010 0101 0101", "1101 0010 1001", "1101 0101 0100", "1101 1010 1010", "1001 1011 0101", "0100 1011 1010", "1010 0011 1011", "0100 1001 1011", "1010 0100 1101", + 0x056B, 0x04AB, 0x0A55, 0x0D29, 0x0D54, 0x0DAA, 0x09B5, 0x04BA, 0x0A3B, 0x049B, 0x0A4D, + //* 1553 -1563 */ + // "1010 1010 1010", "1010 1101 0101", "0010 1101 1010", "1001 0101 1101", "0100 0101 1110", "1010 0010 1110", "1100 1001 1010", "1101 0101 0101", "0110 1011 0010", "0110 1011 1001", "0100 1011 1010", + 0x0AAA, 0x0AD5, 0x02DA, 0x095D, 0x045E, 0x0A2E, 0x0C9A, 0x0D55, 0x06B2, 0x06B9, 0x04BA, + //* 1564 -1574 */ + // "1010 0101 1101", "0101 0010 1101", "1010 1001 0101", "1011 0101 0010", "1011 1010 1000", "1011 1011 0100", "0101 1011 1001", "0010 1101 1010", "1001 0101 1010", "1011 0100 1010", "1101 1010 0100", + 0x0A5D, 0x052D, 0x0A95, 0x0B52, 0x0BA8, 0x0BB4, 0x05B9, 0x02DA, 0x095A, 0x0B4A, 0x0DA4, + //* 1575 -1585 */ + // "1110 1101 0001", "0110 1110 1000", "1011 0110 1010", "0101 0110 1101", "0101 0011 0101", "0110 1001 0101", "1101 0100 1010", "1101 1010 1000", "1101 1101 0100", "0110 1101 1010", "0101 0101 1011", + 0x0ED1, 0x06E8, 0x0B6A, 0x056D, 0x0535, 0x0695, 0x0D4A, 0x0DA8, 0x0DD4, 0x06DA, 0x055B, + //* 1586 -1596 */ + // "0010 1001 1101", "0110 0010 1011", "1011 0001 0101", "1011 0100 1010", "1011 1001 0101", "0101 1010 1010", "1010 1010 1110", "1001 0010 1110", "1100 1000 1111", "0101 0010 0111", "0110 1001 0101", + 0x029D, 0x062B, 0x0B15, 0x0B4A, 0x0B95, 0x05AA, 0x0AAE, 0x092E, 0x0C8F, 0x0527, 0x0695, + //* 1597 -1600 */ + // "0110 1010 1010", "1010 1101 0110", "0101 0101 1101", "0010 1001 1101", }; + 0x06AA, 0x0AD6, 0x055D, 0x029D +]; + +console.log(Buffer.from(new Uint16Array(UMALQURA_MONTHLENGTH).buffer).toString('base64')); diff --git a/packages/@internationalized/date/src/CalendarDate.ts b/packages/@internationalized/date/src/CalendarDate.ts new file mode 100644 index 00000000000..6fc20d77d1e --- /dev/null +++ b/packages/@internationalized/date/src/CalendarDate.ts @@ -0,0 +1,308 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import {add, addTime, addZoned, cycleDate, cycleTime, cycleZoned, set, setTime, setZoned, subtract, subtractTime, subtractZoned} from './manipulation'; +import {AnyCalendarDate, AnyTime, Calendar, CycleOptions, CycleTimeOptions, DateField, DateFields, Disambiguation, Duration, TimeField, TimeFields} from './types'; +import {compareDate, compareTime} from './queries'; +import {dateTimeToString, dateToString, timeToString, zonedDateTimeToString} from './string'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {toCalendarDateTime, toDate, toZoned, zonedToDate} from './conversion'; + +function shiftArgs(args: any[]) { + let calendar: Calendar = typeof args[0] === 'object' + ? args.shift() + : new GregorianCalendar(); + + let era: string; + if (typeof args[0] === 'string') { + era = args.shift(); + } else { + let eras = calendar.getEras(); + era = eras[eras.length - 1]; + } + + let year = args.shift(); + let month = args.shift(); + let day = args.shift(); + + return [calendar, era, year, month, day]; +} + +export class CalendarDate { + // This prevents TypeScript from allowing other types with the same fields to match. + // i.e. a ZonedDateTime should not be be passable to a parameter that expects CalendarDate. + // If that behavior is desired, use the AnyCalendarDate interface instead. + #type; + public readonly calendar: Calendar; + public readonly era: string; + public readonly year: number; + public readonly month: number; + public readonly day: number; + + constructor(year: number, month: number, day: number); + constructor(calendar: Calendar, year: number, month: number, day: number); + constructor(calendar: Calendar, era: string, year: number, month: number, day: number); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + + if (this.calendar.balanceDate) { + this.calendar.balanceDate(this); + } + } + + copy(): CalendarDate { + if (this.era) { + return new CalendarDate(this.calendar, this.era, this.year, this.month, this.day); + } else { + return new CalendarDate(this.calendar, this.year, this.month, this.day); + } + } + + add(duration: Duration) { + return add(this, duration); + } + + subtract(duration: Duration) { + return subtract(this, duration); + } + + set(fields: DateFields) { + return set(this, fields); + } + + cycle(field: DateField, amount: number, options?: CycleOptions) { + return cycleDate(this, field, amount, options); + } + + toDate(timeZone: string) { + return toDate(this, timeZone); + } + + toString() { + return dateToString(this); + } + + compare(b: AnyCalendarDate) { + return compareDate(this, b); + } +} + +export class Time { + // This prevents TypeScript from allowing other types with the same fields to match. + #type; + + constructor( + public readonly hour: number = 0, + public readonly minute: number = 0, + public readonly second: number = 0, + public readonly millisecond: number = 0 + ) {} + + copy(): Time { + return new Time(this.hour, this.minute, this.second, this.millisecond); + } + + add(duration: Duration) { + return addTime(this, duration); + } + + subtract(duration: Duration) { + return subtractTime(this, duration); + } + + set(fields: TimeFields) { + return setTime(this, fields); + } + + cycle(field: TimeField, amount: number, options?: CycleTimeOptions) { + return cycleTime(this, field, amount, options); + } + + toString() { + return timeToString(this); + } + + compare(b: AnyTime) { + return compareTime(this, b); + } +} + +export class CalendarDateTime { + // This prevents TypeScript from allowing other types with the same fields to match. + #type; + public readonly calendar: Calendar; + public readonly era: string; + public readonly year: number; + public readonly month: number; + public readonly day: number; + public readonly hour: number; + public readonly minute: number; + public readonly second: number; + public readonly millisecond: number; + + constructor(year: number, month: number, day: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(calendar: Calendar, year: number, month: number, day: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(calendar: Calendar, era: string, year: number, month: number, day: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + + if (this.calendar.balanceDate) { + this.calendar.balanceDate(this); + } + + this.hour = args.shift() || 0; + this.minute = args.shift() || 0; + this.second = args.shift() || 0; + this.millisecond = args.shift() || 0; + } + + copy(): CalendarDateTime { + if (this.era) { + return new CalendarDateTime(this.calendar, this.era, this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond); + } else { + return new CalendarDateTime(this.calendar, this.year, this.month, this.day, this.hour, this.minute, this.second, this.millisecond); + } + } + + add(duration: Duration) { + return add(this, duration); + } + + subtract(duration: Duration) { + return subtract(this, duration); + } + + set(fields: DateFields & TimeFields) { + return set(setTime(this, fields), fields); + } + + cycle(field: DateField | TimeField, amount: number, options?: CycleTimeOptions) { + switch (field) { + case 'era': + case 'year': + case 'month': + case 'day': + return cycleDate(this, field, amount, options); + default: + return cycleTime(this, field, amount, options); + } + } + + toDate(timeZone: string) { + return toDate(this, timeZone); + } + + toString() { + return dateTimeToString(this); + } + + compare(b: CalendarDate | CalendarDateTime | ZonedDateTime) { + let res = compareDate(this, b); + if (res === 0) { + return compareTime(this, toCalendarDateTime(b)); + } + + return res; + } +} + +export class ZonedDateTime { + // This prevents TypeScript from allowing other types with the same fields to match. + #type; + public readonly calendar: Calendar; + public readonly era: string; + public readonly year: number; + public readonly month: number; + public readonly day: number; + public readonly hour: number; + public readonly minute: number; + public readonly second: number; + public readonly millisecond: number; + public readonly timeZone: string; + public readonly offset: number; + + constructor(year: number, month: number, day: number, timeZone: string, offset: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(calendar: Calendar, year: number, month: number, day: number, timeZone: string, offset: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(calendar: Calendar, era: string, year: number, month: number, day: number, timeZone: string, offset: number, hour?: number, minute?: number, second?: number, millisecond?: number); + constructor(...args: any[]) { + let [calendar, era, year, month, day] = shiftArgs(args); + let timeZone = args.shift(); + let offset = args.shift(); + this.calendar = calendar; + this.era = era; + this.year = year; + this.month = month; + this.day = day; + + if (this.calendar.balanceDate) { + this.calendar.balanceDate(this); + } + + this.timeZone = timeZone; + this.offset = offset; + this.hour = args.shift() || 0; + this.minute = args.shift() || 0; + this.second = args.shift() || 0; + this.millisecond = args.shift() || 0; + } + + copy(): ZonedDateTime { + if (this.era) { + return new ZonedDateTime(this.calendar, this.era, this.year, this.month, this.day, this.timeZone, this.offset, this.hour, this.minute, this.second, this.millisecond); + } else { + return new ZonedDateTime(this.calendar, this.year, this.month, this.day, this.timeZone, this.offset, this.hour, this.minute, this.second, this.millisecond); + } + } + + add(duration: Duration) { + return addZoned(this, duration); + } + + subtract(duration: Duration) { + return subtractZoned(this, duration); + } + + set(fields: DateFields & TimeFields, disambiguation?: Disambiguation) { + return setZoned(this, fields, disambiguation); + } + + cycle(field: DateField | TimeField, amount: number, options?: CycleTimeOptions) { + return cycleZoned(this, field, amount, options); + } + + toDate() { + return zonedToDate(this); + } + + toString() { + return zonedDateTimeToString(this); + } + + toAbsoluteString() { + return this.toDate().toISOString(); + } + + compare(b: CalendarDate | CalendarDateTime | ZonedDateTime) { + // TODO: Is this a bad idea?? + return this.toDate().getTime() - toZoned(b, this.timeZone).toDate().getTime(); + } +} diff --git a/packages/@internationalized/date/src/DateFormatter.ts b/packages/@internationalized/date/src/DateFormatter.ts new file mode 100644 index 00000000000..3ab8ac7aafe --- /dev/null +++ b/packages/@internationalized/date/src/DateFormatter.ts @@ -0,0 +1,179 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +let formatterCache = new Map(); + +interface ResolvedDateTimeFormatOptions extends Intl.ResolvedDateTimeFormatOptions { + hourCycle?: Intl.DateTimeFormatOptions['hourCycle'] +} + +export class DateFormatter implements Intl.DateTimeFormat { + private formatter: Intl.DateTimeFormat; + private options: Intl.DateTimeFormatOptions; + private resolvedHourCycle: Intl.DateTimeFormatOptions['hourCycle']; + + constructor(locale: string, options: Intl.DateTimeFormatOptions = {}) { + this.formatter = getCachedDateFormatter(locale, options); + this.options = options; + } + + format(value: Date): string { + return this.formatter.format(value); + } + + formatToParts(value: Date): Intl.DateTimeFormatPart[] { + return this.formatter.formatToParts(value); + } + + formatRange(start: Date, end: Date) { + // @ts-ignore + if (typeof this.formatter.formatRange === 'function') { + // @ts-ignore + return this.formatter.formatRange(start, end); + } + + if (end < start) { + throw new RangeError('End date must be >= start date'); + } + + // Very basic fallback for old browsers. + return `${this.formatter.format(start)} – ${this.formatter.format(end)}`; + } + + formatRangeToParts(start: Date, end: Date) { + // @ts-ignore + if (typeof this.formatter.formatRangeToParts === 'function') { + // @ts-ignore + return this.formatter.formatRangeToParts(start, end); + } + + if (end < start) { + throw new RangeError('End date must be >= start date'); + } + + let startParts = this.formatter.formatToParts(start); + let endParts = this.formatter.formatToParts(end); + return [ + ...startParts.map(p => ({...p, source: 'startRange'})), + {type: 'literal', value: ' – ', source: 'shared'}, + ...endParts.map(p => ({...p, source: 'endRange'})) + ]; + } + + resolvedOptions(): ResolvedDateTimeFormatOptions { + let resolvedOptions = this.formatter.resolvedOptions() as ResolvedDateTimeFormatOptions; + if (hasBuggyResolvedHourCycle()) { + if (!this.resolvedHourCycle) { + this.resolvedHourCycle = getResolvedHourCycle(resolvedOptions.locale, this.options); + } + resolvedOptions.hourCycle = this.resolvedHourCycle; + resolvedOptions.hour12 = this.resolvedHourCycle === 'h11' || this.resolvedHourCycle === 'h12'; + } + + return resolvedOptions; + } +} + +// There are multiple bugs involving the hour12 and hourCycle options in various browser engines. +// - Chrome [1] (and the ECMA 402 spec [2]) resolve hour12: false in English and other locales to h24 (24:00 - 23:59) +// rather than h23 (00:00 - 23:59). Same can happen with hour12: true in French, which Chrome resolves to h11 (00:00 - 11:59) +// rather than h12 (12:00 - 11:59). +// - WebKit returns an incorrect hourCycle resolved option in the French locale due to incorrect parsing of 'h' literal +// in the resolved pattern. It also formats incorrectly when specifying the hourCycle option for the same reason. [3] +// [1] https://bugs.chromium.org/p/chromium/issues/detail?id=1045791 +// [2] https://github.com/tc39/ecma402/issues/402 +// [3] https://bugs.webkit.org/show_bug.cgi?id=229313 + +// https://github.com/unicode-org/cldr/blob/018b55eff7ceb389c7e3fc44e2f657eae3b10b38/common/supplemental/supplementalData.xml#L4774-L4802 +const hour12Preferences = { + true: { + // Only Japanese uses the h11 style for 12 hour time. All others use h12. + ja: 'h11' + }, + false: { + // All locales use h23 for 24 hour time. None use h24. + } +}; + +function getCachedDateFormatter(locale: string, options: Intl.DateTimeFormatOptions = {}): Intl.DateTimeFormat { + // Work around buggy hour12 behavior in Chrome / ECMA 402 spec by using hourCycle instead. + // Only apply the workaround if the issue is detected, because the hourCycle option is buggy in Safari. + if (typeof options.hour12 === 'boolean' && hasBuggyHour12Behavior()) { + options = {...options}; + let pref = hour12Preferences[String(options.hour12)][locale.split('-')[0]]; + let defaultHourCycle = options.hour12 ? 'h12' : 'h23'; + options.hourCycle = pref ?? defaultHourCycle; + delete options.hour12; + } + + let cacheKey = locale + (options ? Object.entries(options).sort((a, b) => a[0] < b[0] ? -1 : 1).join() : ''); + if (formatterCache.has(cacheKey)) { + return formatterCache.get(cacheKey); + } + + let numberFormatter = new Intl.DateTimeFormat(locale, options); + formatterCache.set(cacheKey, numberFormatter); + return numberFormatter; +} + +let _hasBuggyHour12Behavior: boolean = null; +function hasBuggyHour12Behavior() { + if (_hasBuggyHour12Behavior == null) { + _hasBuggyHour12Behavior = new Intl.DateTimeFormat('en-US', { + hour: 'numeric', + hour12: false + }).format(new Date(2020, 2, 3, 0)) === '24'; + } + + return _hasBuggyHour12Behavior; +} + +let _hasBuggyResolvedHourCycle: boolean = null; +function hasBuggyResolvedHourCycle() { + if (_hasBuggyResolvedHourCycle == null) { + _hasBuggyResolvedHourCycle = (new Intl.DateTimeFormat('fr', { + hour: 'numeric', + hour12: false + }).resolvedOptions() as ResolvedDateTimeFormatOptions).hourCycle === 'h12'; + } + + return _hasBuggyResolvedHourCycle; +} + +function getResolvedHourCycle(locale: string, options: Intl.DateTimeFormatOptions) { + // Work around buggy results in resolved hourCycle and hour12 options in WebKit. + // Format the minimum possible hour and maximum possible hour in a day and parse the results. + locale = locale.replace(/(-u-)?-nu-[a-zA-Z0-9]+/, ''); + locale += (locale.includes('-u-') ? '' : '-u') + '-nu-latn'; + let formatter = getCachedDateFormatter(locale, options); + + let min = parseInt(formatter.formatToParts(new Date(2020, 2, 3, 0)).find(p => p.type === 'hour').value, 10); + let max = parseInt(formatter.formatToParts(new Date(2020, 2, 3, 23)).find(p => p.type === 'hour').value, 10); + + if (min === 0 && max === 23) { + return 'h23'; + } + + if (min === 24 && max === 23) { + return 'h24'; + } + + if (min === 0 && max === 11) { + return 'h11'; + } + + if (min === 12 && max === 11) { + return 'h12'; + } + + throw new Error('Unexpected hour cycle result'); +} diff --git a/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts b/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts new file mode 100644 index 00000000000..84176d214d4 --- /dev/null +++ b/packages/@internationalized/date/src/calendars/BuddhistCalendar.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {GregorianCalendar} from './GregorianCalendar'; +import {Mutable} from '../utils'; + +const BUDDHIST_ERA_START = -543; + +export class BuddhistCalendar extends GregorianCalendar { + identifier = 'buddhist'; + + fromJulianDay(jd: number): CalendarDate { + let date = super.fromJulianDay(jd) as Mutable; + date.year -= BUDDHIST_ERA_START; + return date as CalendarDate; + } + + toJulianDay(date: AnyCalendarDate) { + return super.toJulianDay( + new CalendarDate( + date.year + BUDDHIST_ERA_START, + date.month, + date.day + ) + ); + } + + getEras() { + return ['BE']; + } +} diff --git a/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts b/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts new file mode 100644 index 00000000000..768e83a5f4b --- /dev/null +++ b/packages/@internationalized/date/src/calendars/EthiopicCalendar.ts @@ -0,0 +1,173 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {Mutable} from '../utils'; + +const ETHIOPIC_EPOCH = 1723856; +const COPTIC_EPOCH = 1824665; + +// The delta between Amete Alem 1 and Amete Mihret 1 +// AA 5501 = AM 1 +const AMETE_MIHRET_DELTA = 5500; + +function ceToJulianDay(epoch: number, year: number, month: number, day: number): number { + return ( + epoch // difference from Julian epoch to 1,1,1 + + 365 * year // number of days from years + + Math.floor(year / 4) // extra day of leap year + + 30 * (month - 1) // number of days from months (1 based) + + day - 1 // number of days for present month (1 based) + ); +} + +function julianDayToCE(calendar: Calendar, epoch: number, jd: number): Mutable { + let year = Math.floor((4 * (jd - epoch)) / 1461); + let month = 1 + Math.floor((jd - ceToJulianDay(epoch, year, 1, 1)) / 30); + let day = jd + 1 - ceToJulianDay(epoch, year, month, 1); + + return new CalendarDate(calendar, year, month, day); +} + +function getLeapDay(year: number) { + return Math.floor((year % 4) / 3); +} + +function getDaysInMonth(year: number, month: number) { + // The Ethiopian and Coptic calendars have 13 months, 12 of 30 days each and + // an intercalary month at the end of the year of 5 or 6 days, depending whether + // the year is a leap year or not. The Leap Year follows the same rules as the + // Julian Calendar so that the extra month always has six days in the year before + // a Julian Leap Year. + if (month % 13 !== 0) { + // not intercalary month + return 30; + } else { + // intercalary month 5 days + possible leap day + return getLeapDay(year) + 5; + } +} + +export class EthiopicCalendar implements Calendar { + identifier = 'ethiopic'; + + fromJulianDay(jd: number): CalendarDate { + let date = julianDayToCE(this, ETHIOPIC_EPOCH, jd); + if (date.year > 0) { + date.era = 'AM'; + } else { + date.era = 'AA'; + date.year += AMETE_MIHRET_DELTA; + } + + return date as CalendarDate; + } + + toJulianDay(date: AnyCalendarDate) { + let year = date.year; + if (date.era === 'AA') { + year -= AMETE_MIHRET_DELTA; + } + + return ceToJulianDay(ETHIOPIC_EPOCH, year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let year = date.year; + if (date.era === 'AA') { + year -= AMETE_MIHRET_DELTA; + } + + return getDaysInMonth(year, date.month); + } + + getMonthsInYear(): number { + return 13; + } + + getDaysInYear(date: AnyCalendarDate): number { + return 365 + getLeapDay(date.year); + } + + getYearsInEra(): number { + return 9999; + } + + getEras() { + return ['AA', 'AM']; + } +} + +export class EthiopicAmeteAlemCalendar extends EthiopicCalendar { + identifier = 'ethioaa'; // also known as 'ethiopic-amete-alem' in ICU + + fromJulianDay(jd: number): CalendarDate { + let date = julianDayToCE(this, ETHIOPIC_EPOCH, jd); + date.era = 'AA'; + date.year += AMETE_MIHRET_DELTA; + return date as CalendarDate; + } + + getEras() { + return ['AA']; + } +} + +export class CopticCalendar extends EthiopicCalendar { + identifier = 'coptic'; + + fromJulianDay(jd: number): CalendarDate { + let date = julianDayToCE(this, COPTIC_EPOCH, jd); + if (date.year <= 0) { + date.era = 'BCE'; + date.year = 1 - date.year; + } else { + date.era = 'CE'; + } + + return date as CalendarDate; + } + + toJulianDay(date: AnyCalendarDate) { + let year = date.year; + if (date.era === 'BCE') { + year = 1 - year; + } + + return ceToJulianDay(COPTIC_EPOCH, year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let year = date.year; + if (date.era === 'BCE') { + year = 1 - year; + } + + return getDaysInMonth(year, date.month); + } + + addYears(date: Mutable, years: number) { + if (date.era === 'BCE') { + years = -years; + } + + date.year += years; + } + + getEras() { + return ['BCE', 'CE']; + } +} diff --git a/packages/@internationalized/date/src/calendars/GregorianCalendar.ts b/packages/@internationalized/date/src/calendars/GregorianCalendar.ts new file mode 100644 index 00000000000..da73f217e8a --- /dev/null +++ b/packages/@internationalized/date/src/calendars/GregorianCalendar.ts @@ -0,0 +1,103 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod} from '../utils'; + +const EPOCH = 1721426; // 001/01/03 Julian C.E. +export function gregorianToJulianDay(year: number, month: number, day: number): number { + let y1 = year - 1; + let monthOffset = -2; + if (month <= 2) { + monthOffset = 0; + } else if (isLeapYear(year)) { + monthOffset = -1; + } + + return ( + EPOCH - + 1 + + 365 * y1 + + Math.floor(y1 / 4) - + Math.floor(y1 / 100) + + Math.floor(y1 / 400) + + Math.floor((367 * month - 362) / 12 + monthOffset + day) + ); +} + +export function isLeapYear(year: number): boolean { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} + +const daysInMonth = { + standard: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + leapyear: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] +}; + +export class GregorianCalendar implements Calendar { + identifier = 'gregory'; + + fromJulianDay(jd: number): CalendarDate { + let jd0 = jd; + let depoch = jd0 - EPOCH; + let quadricent = Math.floor(depoch / 146097); + let dqc = mod(depoch, 146097); + let cent = Math.floor(dqc / 36524); + let dcent = mod(dqc, 36524); + let quad = Math.floor(dcent / 1461); + let dquad = mod(dcent, 1461); + let yindex = Math.floor(dquad / 365); + + let year = quadricent * 400 + cent * 100 + quad * 4 + yindex + (cent !== 4 && yindex !== 4 ? 1 : 0); + let yearDay = jd0 - gregorianToJulianDay(year, 1, 1); + let leapAdj = 2; + if (jd0 < gregorianToJulianDay(year, 3, 1)) { + leapAdj = 0; + } else if (isLeapYear(year)) { + leapAdj = 1; + } + let month = Math.floor(((yearDay + leapAdj) * 12 + 373) / 367); + let day = jd0 - gregorianToJulianDay(year, month, 1) + 1; + + return new CalendarDate(this, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + return gregorianToJulianDay(date.year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + return daysInMonth[isLeapYear(date.year) ? 'leapyear' : 'standard'][date.month - 1]; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getMonthsInYear(date: AnyCalendarDate): number { + return 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 366 : 365; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + getYearsInEra(date: AnyCalendarDate): number { + return 9999; + } + + getEras() { + return ['BC', 'AD']; + } +} diff --git a/packages/@internationalized/date/src/calendars/HebrewCalendar.ts b/packages/@internationalized/date/src/calendars/HebrewCalendar.ts new file mode 100644 index 00000000000..d7db658f623 --- /dev/null +++ b/packages/@internationalized/date/src/calendars/HebrewCalendar.ts @@ -0,0 +1,197 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod, Mutable} from '../utils'; + +const HEBREW_EPOCH = 347997; + +// Hebrew date calculations are performed in terms of days, hours, and +// "parts" (or halakim), which are 1/1080 of an hour, or 3 1/3 seconds. +const HOUR_PARTS = 1080; +const DAY_PARTS = 24 * HOUR_PARTS; + +// An approximate value for the length of a lunar month. +// It is used to calculate the approximate year and month of a given +// absolute date. +const MONTH_DAYS = 29; +const MONTH_FRACT = 12 * HOUR_PARTS + 793; +const MONTH_PARTS = MONTH_DAYS * DAY_PARTS + MONTH_FRACT; + +function isLeapYear(year: number) { + return mod(year * 7 + 1, 19) < 7; +} + +// Test for delay of start of new year and to avoid +// Sunday, Wednesday, and Friday as start of the new year. +function hebrewDelay1(year: number) { + let months = Math.floor((235 * year - 234) / 19); + let parts = 12084 + 13753 * months; + let day = months * 29 + Math.floor(parts / 25920); + + if (mod(3 * (day + 1), 7) < 3) { + day += 1; + } + + return day; +} + +// Check for delay in start of new year due to length of adjacent years +function hebrewDelay2(year: number) { + let last = hebrewDelay1(year - 1); + let present = hebrewDelay1(year); + let next = hebrewDelay1(year + 1); + + if (next - present === 356) { + return 2; + } + + if (present - last === 382) { + return 1; + } + + return 0; +} + +function startOfYear(year: number) { + return hebrewDelay1(year) + hebrewDelay2(year); +} + +function getDaysInYear(year: number) { + return startOfYear(year + 1) - startOfYear(year); +} + +function getYearType(year: number) { + let yearLength = getDaysInYear(year); + + if (yearLength > 380) { + yearLength -= 30; // Subtract length of leap month. + } + + switch (yearLength) { + case 353: + return 0; // deficient + case 354: + return 1; // normal + case 355: + return 2; // complete + } +} + +function getDaysInMonth(year: number, month: number): number { + // Normalize month numbers from 1 - 13, even on non-leap years + if (month >= 6 && !isLeapYear(year)) { + month++; + } + + // First of all, dispose of fixed-length 29 day months + if (month === 4 || month === 7 || month === 9 || month === 11 || month === 13) { + return 29; + } + + let yearType = getYearType(year); + + // If it's Heshvan, days depend on length of year + if (month === 2) { + return yearType === 2 ? 30 : 29; + } + + // Similarly, Kislev varies with the length of year + if (month === 3) { + return yearType === 0 ? 29 : 30; + } + + // Adar I only exists in leap years + if (month === 6) { + return isLeapYear(year) ? 30 : 0; + } + + return 30; +} + +export class HebrewCalendar implements Calendar { + identifier = 'hebrew'; + + fromJulianDay(jd: number): CalendarDate { + let d = jd - HEBREW_EPOCH; + let m = (d * DAY_PARTS) / MONTH_PARTS; // Months (approx) + let year = Math.floor((19 * m + 234) / 235) + 1; // Years (approx) + let ys = startOfYear(year); // 1st day of year + let dayOfYear = Math.floor(d - ys); + + // Because of the postponement rules, it's possible to guess wrong. Fix it. + while (dayOfYear < 1) { + year--; + ys = startOfYear(year); + dayOfYear = Math.floor(d - ys); + } + + // Now figure out which month we're in, and the date within that month + let month = 1; + let monthStart = 0; + while (monthStart < dayOfYear) { + monthStart += getDaysInMonth(year, month); + month++; + } + + month--; + monthStart -= getDaysInMonth(year, month); + + let day = dayOfYear - monthStart; + return new CalendarDate(this, year, month, day); + } + + toJulianDay(date: AnyCalendarDate) { + let jd = startOfYear(date.year); + for (let month = 1; month < date.month; month++) { + jd += getDaysInMonth(date.year, month); + } + + return jd + date.day + HEBREW_EPOCH; + } + + getDaysInMonth(date: AnyCalendarDate): number { + return getDaysInMonth(date.year, date.month); + } + + getMonthsInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 13 : 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return getDaysInYear(date.year); + } + + getYearsInEra(): number { + return 9999; + } + + getEras() { + return ['AM']; + } + + addYears(date: Mutable, years: number) { + // Keep date in the same month when switching between leap years and non leap years + let nextYear = date.year + years; + if (isLeapYear(date.year) && !isLeapYear(nextYear) && date.month > 6) { + date.month--; + } else if (!isLeapYear(date.year) && isLeapYear(nextYear) && date.month > 6) { + date.month++; + } + + date.year = nextYear; + } +} diff --git a/packages/@internationalized/date/src/calendars/IndianCalendar.ts b/packages/@internationalized/date/src/calendars/IndianCalendar.ts new file mode 100644 index 00000000000..e17d4f39d1b --- /dev/null +++ b/packages/@internationalized/date/src/calendars/IndianCalendar.ts @@ -0,0 +1,120 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {GregorianCalendar, gregorianToJulianDay, isLeapYear} from './GregorianCalendar'; +import {Mutable} from '../utils'; + +// Starts in 78 AD, +const INDIAN_ERA_START = 78; + +// The Indian year starts 80 days later than the Gregorian year. +const INDIAN_YEAR_START = 80; + +export class IndianCalendar extends GregorianCalendar { + identifier = 'indian'; + + fromJulianDay(jd: number): CalendarDate { + // Gregorian date for Julian day + let date = super.fromJulianDay(jd) as Mutable; + + // Year in Saka era + let indianYear = date.year - INDIAN_ERA_START; + + // Day number in Gregorian year (starting from 0) + let yDay = jd - gregorianToJulianDay(date.year, 1, 1); + + let leapMonth: number; + if (yDay < INDIAN_YEAR_START) { + // Day is at the end of the preceding Saka year + indianYear--; + + // Days in leapMonth this year, previous Gregorian year + leapMonth = isLeapYear(date.year - 1) ? 31 : 30; + yDay += leapMonth + (31 * 5) + (30 * 3) + 10; + } else { + // Days in leapMonth this year + leapMonth = isLeapYear(date.year) ? 31 : 30; + yDay -= INDIAN_YEAR_START; + } + + let indianMonth: number; + let indianDay: number; + if (yDay < leapMonth) { + indianMonth = 1; + indianDay = yDay + 1; + } else { + let mDay = yDay - leapMonth; + if (mDay < (31 * 5)) { + indianMonth = Math.floor(mDay / 31) + 2; + indianDay = (mDay % 31) + 1; + } else { + mDay -= 31 * 5; + indianMonth = Math.floor(mDay / 30) + 7; + indianDay = (mDay % 30) + 1; + } + } + + return new CalendarDate(this, indianYear, indianMonth, indianDay); + } + + toJulianDay(date: AnyCalendarDate) { + let year = date.year + INDIAN_ERA_START; + + let leapMonth: number; + let jd: number; + if (isLeapYear(year)) { + leapMonth = 31; + jd = gregorianToJulianDay(year, 3, 21); + } else { + leapMonth = 30; + jd = gregorianToJulianDay(year, 3, 22); + } + + if (date.month === 1) { + return jd + date.day - 1; + } + + jd += leapMonth + Math.min(date.month - 2, 5) * 31; + + if (date.month >= 8) { + jd += (date.month - 7) * 30; + } + + jd += date.day - 1; + return jd; + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.month === 1 && isLeapYear(date.year + INDIAN_ERA_START)) { + return 31; + } + + if (date.month >= 2 && date.month <= 6) { + return 31; + } + + return 30; + } + + getYearsInEra(): number { + return 9999; + } + + getEras() { + return ['saka']; + } +} diff --git a/packages/@internationalized/date/src/calendars/IslamicCalendar.ts b/packages/@internationalized/date/src/calendars/IslamicCalendar.ts new file mode 100644 index 00000000000..69f498e474f --- /dev/null +++ b/packages/@internationalized/date/src/calendars/IslamicCalendar.ts @@ -0,0 +1,203 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar} from '../types'; +import {CalendarDate} from '../CalendarDate'; + +const CIVIL_EPOC = 1948440; // CE 622 July 16 Friday (Julian calendar) / CE 622 July 19 (Gregorian calendar) +const ASTRONOMICAL_EPOC = 1948439; // CE 622 July 15 Thursday (Julian calendar) +const UMALQURA_YEAR_START = 1300; +const UMALQURA_YEAR_END = 1600; +const UMALQURA_START_DAYS = 460322; + +function islamicToJulianDay(epoch: number, year: number, month: number, day: number): number { + return day + + Math.ceil(29.5 * (month - 1)) + + (year - 1) * 354 + + Math.floor((3 + 11 * year) / 30) + + epoch - 1; +} + +function julianDayToIslamic(calendar: Calendar, epoch: number, jd: number) { + let year = Math.floor((30 * (jd - epoch) + 10646) / 10631); + let month = Math.min(12, Math.ceil((jd - (29 + islamicToJulianDay(epoch, year, 1, 1))) / 29.5) + 1); + let day = jd - islamicToJulianDay(epoch, year, month, 1) + 1; + + return new CalendarDate(calendar, year, month, day); +} + +function isLeapYear(year: number): boolean { + return (14 + 11 * year) % 30 < 11; +} + +export class IslamicCivilCalendar implements Calendar { + identifier = 'islamic-civil'; + + fromJulianDay(jd: number): CalendarDate { + return julianDayToIslamic(this, CIVIL_EPOC, jd); + } + + toJulianDay(date: AnyCalendarDate) { + return islamicToJulianDay(CIVIL_EPOC, date.year, date.month, date.day); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let length = 29 + date.month % 2; + if (date.month === 12 && isLeapYear(date.year)) { + length++; + } + + return length; + } + + getMonthsInYear(): number { + return 12; + } + + getDaysInYear(date: AnyCalendarDate): number { + return isLeapYear(date.year) ? 355 : 354; + } + + getYearsInEra(): number { + return 9999; + } + + getEras() { + return ['AH']; + } +} + +export class IslamicTabularCalendar extends IslamicCivilCalendar { + identifier = 'islamic-tbla'; + + fromJulianDay(jd: number): CalendarDate { + return julianDayToIslamic(this, ASTRONOMICAL_EPOC, jd); + } + + toJulianDay(date: AnyCalendarDate) { + return islamicToJulianDay(ASTRONOMICAL_EPOC, date.year, date.month, date.day); + } +} + +// Generated by scripts/generate-umalqura.js +const UMALQURA_DATA = 'qgpUDckO1AbqBmwDrQpVBakGkgepC9QF2gpcBS0NlQZKB1QLagutBa4ETwoXBYsGpQbVCtYCWwmdBE0KJg2VDawFtgm6AlsKKwWVCsoG6Qr0AnYJtgJWCcoKpAvSC9kF3AJtCU0FpQpSC6ULtAW2CVcFlwJLBaMGUgdlC2oFqworBZUMSg2lDcoF1gpXCasESwmlClILagt1BXYCtwhbBFUFqQW0BdoJ3QRuAjYJqgpUDbIN1QXaAlsJqwRVCkkLZAtxC7QFtQpVCiUNkg7JDtQG6QprCasEkwpJDaQNsg25CroEWworBZUKKgtVC1wFvQQ9Ah0JlQpKC1oLbQW2AjsJmwRVBqkGVAdqC2wFrQpVBSkLkgupC9QF2gpaBasKlQVJB2QHqgu1BbYCVgpNDiULUgtqC60FrgIvCZcESwalBqwG1gpdBZ0ETQoWDZUNqgW1BdoCWwmtBJUFygbkBuoK9QS2AlYJqgpUC9IL2QXqAm0JrQSVCkoLpQuyBbUJ1gSXCkcFkwZJB1ULagVrCisFiwpGDaMNygXWCtsEawJLCaUKUgtpC3UFdgG3CFsCKwVlBbQF2gntBG0BtgimClINqQ3UBdoKWwmrBFMGKQdiB6kLsgW1ClUFJQuSDckO0gbpCmsFqwRVCikNVA2qDbUJugQ7CpsETQqqCtUK2gJdCV4ELgqaDFUNsga5BroEXQotBZUKUguoC7QLuQXaAloJSgukDdEO6AZqC20FNQWVBkoNqA3UDdoGWwWdAisGFQtKC5ULqgWuCi4JjwwnBZUGqgbWCl0FnQI='; +let UMALQURA_MONTHLENGTH: Uint16Array; +let UMALQURA_YEAR_START_TABLE: Uint32Array; + +function umalquraYearStart(year: number): number { + return UMALQURA_START_DAYS + UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START]; +} + +function umalquraMonthLength(year: number, month: number): number { + let idx = (year - UMALQURA_YEAR_START); + let mask = (0x01 << (11 - (month - 1))); + if ((UMALQURA_MONTHLENGTH[idx] & mask) === 0) { + return 29; + } else { + return 30; + } +} + +function umalquraMonthStart(year: number, month: number): number { + let day = umalquraYearStart(year); + for (let i = 1; i < month; i++) { + day += umalquraMonthLength(year, i); + } + return day; +} + +function umalquraYearLength(year: number): number { + return UMALQURA_YEAR_START_TABLE[year + 1 - UMALQURA_YEAR_START] - UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START]; +} + +export class IslamicUmalquraCalendar extends IslamicCivilCalendar { + identifier = 'islamic-umalqura'; + + constructor() { + super(); + if (!UMALQURA_MONTHLENGTH) { + UMALQURA_MONTHLENGTH = new Uint16Array(Uint8Array.from(atob(UMALQURA_DATA), c => c.charCodeAt(0)).buffer); + } + + if (!UMALQURA_YEAR_START_TABLE) { + UMALQURA_YEAR_START_TABLE = new Uint32Array(UMALQURA_YEAR_END - UMALQURA_YEAR_START + 1); + + let yearStart = 0; + for (let year = UMALQURA_YEAR_START; year <= UMALQURA_YEAR_END; year++) { + UMALQURA_YEAR_START_TABLE[year - UMALQURA_YEAR_START] = yearStart; + for (let i = 1; i <= 12; i++) { + yearStart += umalquraMonthLength(year, i); + } + } + } + } + + fromJulianDay(jd: number): CalendarDate { + let days = jd - CIVIL_EPOC; + let startDays = umalquraYearStart(UMALQURA_YEAR_START); + let endDays = umalquraYearStart(UMALQURA_YEAR_END); + if (days < startDays || days > endDays) { + return super.fromJulianDay(jd); + } else { + let y = UMALQURA_YEAR_START - 1; + let m = 1; + let d = 1; + while (d > 0) { + y++; + d = days - umalquraYearStart(y) + 1; + let yearLength = umalquraYearLength(y); + if (d === yearLength) { + m = 12; + break; + } else if (d < yearLength) { + let monthLength = umalquraMonthLength(y, m); + m = 1; + while (d > monthLength) { + d -= monthLength; + m++; + monthLength = umalquraMonthLength(y, m); + } + break; + } + } + + return new CalendarDate(this, y, m, (days - umalquraMonthStart(y, m) + 1)); + } + } + + toJulianDay(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.toJulianDay(date); + } + + return CIVIL_EPOC + umalquraMonthStart(date.year, date.month) + (date.day - 1); + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.getDaysInMonth(date); + } + + return umalquraMonthLength(date.year, date.month); + } + + getDaysInYear(date: AnyCalendarDate): number { + if (date.year < UMALQURA_YEAR_START || date.year > UMALQURA_YEAR_END) { + return super.getDaysInYear(date); + } + + return umalquraYearLength(date.year); + } +} diff --git a/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts b/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts new file mode 100644 index 00000000000..dc78f74da49 --- /dev/null +++ b/packages/@internationalized/date/src/calendars/JapaneseCalendar.ts @@ -0,0 +1,198 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from the TC39 Temporal proposal. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Duration} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {GregorianCalendar} from './GregorianCalendar'; +import {Mutable} from '../utils'; +import {toCalendar} from '../conversion'; + +const ERA_START_DATES = [[1868, 9, 8], [1912, 7, 30], [1926, 12, 25], [1989, 1, 8], [2019, 5, 1]]; +const ERA_END_DATES = [[1912, 7, 29], [1926, 12, 24], [1989, 1, 7], [2019, 4, 30]]; +const ERA_ADDENDS = [1867, 1911, 1925, 1988, 2018]; +const ERA_NAMES = ['meiji', 'taisho', 'showa', 'heisei', 'reiwa']; + +function findEraFromGregorianDate(date: AnyCalendarDate) { + const idx = ERA_START_DATES.findIndex(([year, month, day]) => { + if (date.year < year) { + return true; + } + + if (date.year === year && date.month < month) { + return true; + } + + if (date.year === year && date.month === month && date.day < day) { + return true; + } + + return false; + }); + + if (idx === -1) { + return ERA_START_DATES.length - 1; + } + + if (idx === 0) { + return 0; + } + + return idx - 1; +} + +function toGregorian(date: AnyCalendarDate) { + let eraAddend = ERA_ADDENDS[ERA_NAMES.indexOf(date.era)]; + if (!eraAddend) { + throw new Error('Unknown era: ' + date.era); + } + + return new CalendarDate( + date.year + eraAddend, + date.month, + date.day + ); +} + +export class JapaneseCalendar extends GregorianCalendar { + identifier = 'japanese'; + + fromJulianDay(jd: number): CalendarDate { + let date = super.fromJulianDay(jd) as Mutable; + + let era = findEraFromGregorianDate(date); + date.era = ERA_NAMES[era]; + date.year -= ERA_ADDENDS[era]; + return date as CalendarDate; + } + + toJulianDay(date: AnyCalendarDate) { + return super.toJulianDay(toGregorian(date)); + } + + balanceDate(date: Mutable) { + let gregorianDate = toGregorian(date); + let era = findEraFromGregorianDate(gregorianDate); + + if (ERA_NAMES[era] !== date.era) { + date.era = ERA_NAMES[era]; + date.year = gregorianDate.year - ERA_ADDENDS[era]; + } + } + + add(date: AnyCalendarDate, duration: Duration) { + // Always do addition in the gregorian calendar to avoid issues with eras. + // For example, Heisei 31/4/30 + 1 day is Reiwa 1/5/1. Reiwa 1/1/1 does not exist. + return toCalendar(toGregorian(date).add(duration), this); + } + + constrainDate(date: Mutable) { + let idx = ERA_NAMES.indexOf(date.era); + let end = ERA_END_DATES[idx]; + if (end != null) { + let [, endMonth, endDay] = end; + + // Constrain the year to the maximum possible value in the era. + // Then constrain the month and day fields within that. + let maxYear = getMaxYear(idx); + date.year = Math.min(maxYear, date.year); + if (date.year === maxYear) { + date.month = Math.min(endMonth, date.month); + + if (date.month === endMonth) { + date.day = Math.min(endDay, date.day); + } + } + + if (date.year === 1) { + let [, startMonth, startDay] = ERA_START_DATES[idx]; + date.month = Math.max(startMonth, date.month); + + if (date.month === startMonth) { + date.day = Math.max(startDay, date.day); + } + } + } + } + + getEras() { + return ERA_NAMES; + } + + getYearsInEra(date: AnyCalendarDate): number { + // Get the number of years in the era, taking into account the date's month and day fields. + let era = ERA_NAMES.indexOf(date.era); + let next = ERA_START_DATES[era + 1]; + if (next == null) { + return 9999; + } + + let cur = ERA_START_DATES[era]; + let years = next[0] - cur[0]; + + if (date.month < next[1] || (date.month === next[1] && date.day < next[2])) { + years++; + } + + return years; + } + + getMonthsInYear(date: AnyCalendarDate): number { + let idx = ERA_NAMES.indexOf(date.era); + let end = ERA_END_DATES[idx]; + if (end && date.year === getMaxYear(idx)) { + return end[1]; + } + + return super.getMonthsInYear(date); + } + + getDaysInMonth(date: AnyCalendarDate): number { + let idx = ERA_NAMES.indexOf(date.era); + let end = ERA_END_DATES[idx]; + if (end && date.year === getMaxYear(idx) && date.month === end[1]) { + return end[2]; + } + + return super.getDaysInMonth(date); + } + + getMinimumMonthInYear(date: AnyCalendarDate): number { + let start = getMinimums(date); + return start ? start[1] : 1; + } + + getMinimumDayInMonth(date: AnyCalendarDate): number { + let start = getMinimums(date); + return start && date.month === start[1] ? start[2] : 1; + } +} + +function getMinimums(date: AnyCalendarDate) { + if (date.year === 1) { + let idx = ERA_NAMES.indexOf(date.era); + return ERA_START_DATES[idx]; + } +} + +function getMaxYear(era: number) { + let [endYear, endMonth, endDay] = ERA_END_DATES[era]; + let [startYear, startMonth, startDay] = ERA_START_DATES[era]; + let maxYear = endYear - startYear; + if (startMonth < endMonth || (startMonth === endMonth && startDay < endDay)) { + maxYear++; + } + + return maxYear; +} diff --git a/packages/@internationalized/date/src/calendars/PersianCalendar.ts b/packages/@internationalized/date/src/calendars/PersianCalendar.ts new file mode 100644 index 00000000000..ae2216a355b --- /dev/null +++ b/packages/@internationalized/date/src/calendars/PersianCalendar.ts @@ -0,0 +1,92 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, Calendar} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {mod} from '../utils'; + +const PERSIAN_EPOCH = 1948321; // 622/03/19 Julian C.E. + +function isLeapYear(year: number): boolean { + let y0 = year > 0 ? year - 474 : year - 473; + let y1 = mod(y0, 2820) + 474; + + return mod((y1 + 38) * 31, 128) < 31; +} + +function persianToJulianDay(year: number, month: number, day: number): number { + let y0 = year > 0 ? year - 474 : year - 473; + let y1 = mod(y0, 2820) + 474; + let offset = month <= 7 ? 31 * (month - 1) : 30 * (month - 1) + 6; + + return ( + PERSIAN_EPOCH - + 1 + + 1029983 * Math.floor(y0 / 2820) + + 365 * (y1 - 1) + + Math.floor((31 * y1 - 5) / 128) + + offset + + day + ); +} + +export class PersianCalendar implements Calendar { + identifier = 'persian'; + + fromJulianDay(jd: number): CalendarDate { + let d0 = jd - persianToJulianDay(475, 1, 1); + let n2820 = Math.floor(d0 / 1029983); + let d1 = mod(d0, 1029983); + let y2820 = d1 === 1029982 ? 2820 : Math.floor((128 * d1 + 46878) / 46751); + let year = 474 + 2820 * n2820 + y2820; + if (year <= 0) { + year--; + } + + let yDay = jd - persianToJulianDay(year, 1, 1) + 1; + let month = yDay <= 186 ? Math.ceil(yDay / 31) : Math.ceil((yDay - 6) / 31); + let day = jd - persianToJulianDay(year, month, 1) + 1; + + return new CalendarDate(this, year, month, day); + } + + toJulianDay(date: AnyCalendarDate): number { + return persianToJulianDay(date.year, date.month, date.day); + } + + getMonthsInYear(): number { + return 12; + } + + getDaysInMonth(date: AnyCalendarDate): number { + if (date.month <= 6) { + return 31; + } + + if (date.month <= 11) { + return 30; + } + + return isLeapYear(date.year) ? 30 : 29; + } + + getEras() { + return ['AP']; + } + + getYearsInEra(): number { + return 9999; + } +} diff --git a/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts b/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts new file mode 100644 index 00000000000..858acc8cdfb --- /dev/null +++ b/packages/@internationalized/date/src/calendars/TaiwanCalendar.ts @@ -0,0 +1,74 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from ICU. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate} from '../types'; +import {CalendarDate} from '../CalendarDate'; +import {GregorianCalendar} from './GregorianCalendar'; +import {Mutable} from '../utils'; + +const TAIWAN_ERA_START = 1911; + +function gregorianYear(date: AnyCalendarDate) { + return date.era === 'minguo' + ? date.year + TAIWAN_ERA_START + : 1 - date.year + TAIWAN_ERA_START; +} + +function gregorianToTaiwan(year: number, date: Mutable) { + let y = year - TAIWAN_ERA_START; + if (y > 0) { + date.era = 'minguo'; + date.year = y; + } else { + date.era = 'before_minguo'; + date.year = 1 - y; + } +} + +export class TaiwanCalendar extends GregorianCalendar { + identifier = 'roc'; // Republic of China + + fromJulianDay(jd: number): CalendarDate { + let date: Mutable = super.fromJulianDay(jd); + gregorianToTaiwan(date.year, date); + return date as CalendarDate; + } + + toJulianDay(date: AnyCalendarDate) { + return super.toJulianDay( + new CalendarDate( + gregorianYear(date), + date.month, + date.day + ) + ); + } + + getEras() { + return ['before_minguo', 'minguo']; + } + + balanceDate(date: Mutable) { + gregorianToTaiwan(gregorianYear(date), date); + } + + addYears(date: Mutable, years: number) { + if (date.era === 'before_minguo') { + years = -years; + } + + date.year += years; + } +} diff --git a/packages/@internationalized/date/src/conversion.ts b/packages/@internationalized/date/src/conversion.ts new file mode 100644 index 00000000000..74e53bb7ece --- /dev/null +++ b/packages/@internationalized/date/src/conversion.ts @@ -0,0 +1,257 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +// Portions of the code in this file are based on code from the TC39 Temporal proposal. +// Original licensing can be found in the NOTICE file in the root directory of this source tree. + +import {AnyCalendarDate, AnyDateTime, AnyTime, Calendar, DateFields, Disambiguation, TimeFields} from './types'; +import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; +import {getLocalTimeZone} from './queries'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {Mutable} from './utils'; + +export function epochFromDate(date: AnyDateTime) { + date = toCalendar(date, new GregorianCalendar()); + return epochFromParts(date.year, date.month, date.day, date.hour, date.minute, date.second, date.millisecond); +} + +function epochFromParts(year: number, month: number, day: number, hour: number, minute: number, second: number, millisecond: number) { + // Note: Date.UTC() interprets one and two-digit years as being in the + // 20th century, so don't use it + let date = new Date(); + date.setUTCHours(hour, minute, second, millisecond); + date.setUTCFullYear(year, month - 1, day); + return date.getTime(); +} + +export function getTimeZoneOffset(ms: number, timeZone: string) { + let {year, month, day, hour, minute, second} = getTimeZoneParts(ms, timeZone); + let utc = epochFromParts(year, month, day, hour, minute, second, 0); + return utc - Math.floor(ms / 1000) * 1000; +} + +const formattersByTimeZone = new Map(); + +function getTimeZoneParts(ms: number, timeZone: string) { + let formatter = formattersByTimeZone.get(timeZone); + if (!formatter) { + formatter = new Intl.DateTimeFormat('en-US', { + timeZone, + hour12: false, + era: 'short', + year: 'numeric', + month: 'numeric', + day: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric' + }); + + formattersByTimeZone.set(timeZone, formatter); + } + + let parts = formatter.formatToParts(new Date(ms)); + let namedParts: {[name: string]: string} = {}; + for (let part of parts) { + if (part.type !== 'literal') { + namedParts[part.type] = part.value; + } + } + + return { + year: namedParts.era === 'BC' ? -namedParts.year + 1 : +namedParts.year, + month: +namedParts.month, + day: +namedParts.day, + hour: namedParts.hour === '24' ? 0 : +namedParts.hour, // bugs.chromium.org/p/chromium/issues/detail?id=1045791 + minute: +namedParts.minute, + second: +namedParts.second + }; +} + +const DAYMILLIS = 86400000; + +export function possibleAbsolutes(date: CalendarDateTime, timeZone: string): number[] { + let ms = epochFromDate(date); + let earlier = ms - getTimeZoneOffset(ms - DAYMILLIS, timeZone); + let later = ms - getTimeZoneOffset(ms + DAYMILLIS, timeZone); + return getValidWallTimes(date, timeZone, earlier, later); +} + +function getValidWallTimes(date: CalendarDateTime, timeZone: string, earlier: number, later: number): number[] { + let found = earlier === later ? [earlier] : [earlier, later]; + return found.filter(absolute => isValidWallTime(date, timeZone, absolute)); +} + +function isValidWallTime(date: CalendarDateTime, timeZone: string, absolute: number) { + let parts = getTimeZoneParts(absolute, timeZone); + return date.year === parts.year + && date.month === parts.month + && date.day === parts.day + && date.hour === parts.hour + && date.minute === parts.minute + && date.second === parts.second; +} + +export function toAbsolute(date: CalendarDate | CalendarDateTime, timeZone: string, disambiguation: Disambiguation = 'compatible'): number { + let dateTime = toCalendarDateTime(date); + let ms = epochFromDate(dateTime); + let offsetBefore = getTimeZoneOffset(ms - DAYMILLIS, timeZone); + let offsetAfter = getTimeZoneOffset(ms + DAYMILLIS, timeZone); + let valid = getValidWallTimes(dateTime, timeZone, ms - offsetBefore, ms - offsetAfter); + + if (valid.length === 1) { + return valid[0]; + } + + if (valid.length > 1) { + switch (disambiguation) { + // 'compatible' means 'earlier' for "fall back" transitions + case 'compatible': + case 'earlier': + return valid[0]; + case 'later': + return valid[valid.length - 1]; + case 'reject': + throw new RangeError('Multiple possible absolute times found'); + } + } + + switch (disambiguation) { + case 'earlier': + return Math.min(ms - offsetBefore, ms - offsetAfter); + // 'compatible' means 'later' for "spring forward" transitions + case 'compatible': + case 'later': + return Math.max(ms - offsetBefore, ms - offsetAfter); + case 'reject': + throw new RangeError('No such absolute time found'); + } +} + +export function toDate(dateTime: CalendarDate | CalendarDateTime, timeZone: string, disambiguation: Disambiguation = 'compatible'): Date { + return new Date(toAbsolute(dateTime, timeZone, disambiguation)); +} + +export function fromAbsolute(ms: number, timeZone: string): ZonedDateTime { + let offset = getTimeZoneOffset(ms, timeZone); + let date = new Date(ms + offset); + let year = date.getUTCFullYear(); + let month = date.getUTCMonth() + 1; + let day = date.getUTCDate(); + let hour = date.getUTCHours(); + let minute = date.getUTCMinutes(); + let second = date.getUTCSeconds(); + let millisecond = date.getUTCMilliseconds(); + + return new ZonedDateTime(year, month, day, timeZone, offset, hour, minute, second, millisecond); +} + +export function fromDate(date: Date, timeZone: string): ZonedDateTime { + return fromAbsolute(date.getTime(), timeZone); +} + +export function fromDateToLocal(date: Date): ZonedDateTime { + return fromDate(date, getLocalTimeZone()); +} + +export function toCalendarDate(dateTime: AnyCalendarDate): CalendarDate { + return new CalendarDate(dateTime.calendar, dateTime.era, dateTime.year, dateTime.month, dateTime.day); +} + +export function toDateFields(date: AnyCalendarDate): DateFields { + return { + era: date.era, + year: date.year, + month: date.month, + day: date.day + }; +} + +export function toTimeFields(date: AnyTime): TimeFields { + return { + hour: date.hour, + minute: date.minute, + second: date.second, + millisecond: date.millisecond + }; +} + +export function toCalendarDateTime(date: CalendarDate | CalendarDateTime | ZonedDateTime, time?: AnyTime): CalendarDateTime { + let hour = 0, minute = 0, second = 0, millisecond = 0; + if ('timeZone' in date) { + ({hour, minute, second, millisecond} = date); + } else if ('hour' in date && !time) { + return date; + } + + if (time) { + ({hour, minute, second, millisecond} = time); + } + + return new CalendarDateTime( + date.calendar, + date.era, + date.year, + date.month, + date.day, + hour, + minute, + second, + millisecond + ); +} + +export function toTime(dateTime: CalendarDateTime): Time { + return new Time(dateTime.hour, dateTime.minute, dateTime.second, dateTime.millisecond); +} + +export function toCalendar(date: T, calendar: Calendar): T { + if (date.calendar.identifier === calendar.identifier) { + return date; + } + + let calendarDate = calendar.fromJulianDay(date.calendar.toJulianDay(date)); + let copy: Mutable = date.copy(); + copy.calendar = calendar; + copy.era = calendarDate.era; + copy.year = calendarDate.year; + copy.month = calendarDate.month; + copy.day = calendarDate.day; + return copy; +} + +export function toZoned(date: CalendarDate | CalendarDateTime | ZonedDateTime, timeZone: string, disambiguation?: Disambiguation) { + if (date instanceof ZonedDateTime) { + if (date.timeZone === timeZone) { + return date; + } + + return toTimeZone(date, timeZone); + } + + let ms = toAbsolute(date, timeZone, disambiguation); + return fromAbsolute(ms, timeZone); +} + +export function zonedToDate(date: ZonedDateTime) { + let ms = epochFromDate(date) - date.offset; + return new Date(ms); +} + +export function toTimeZone(date: ZonedDateTime, timeZone: string): ZonedDateTime { + let ms = epochFromDate(date) - date.offset; + return toCalendar(fromAbsolute(ms, timeZone), date.calendar); +} + +export function toLocalTimeZone(date: ZonedDateTime) { + return toTimeZone(date, getLocalTimeZone()); +} diff --git a/packages/@internationalized/date/src/createCalendar.ts b/packages/@internationalized/date/src/createCalendar.ts new file mode 100644 index 00000000000..6d3b8cf6abc --- /dev/null +++ b/packages/@internationalized/date/src/createCalendar.ts @@ -0,0 +1,54 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import {BuddhistCalendar} from './calendars/BuddhistCalendar'; +import {Calendar} from './types'; +import {CopticCalendar, EthiopicAmeteAlemCalendar, EthiopicCalendar} from './calendars/EthiopicCalendar'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {HebrewCalendar} from './calendars/HebrewCalendar'; +import {IndianCalendar} from './calendars/IndianCalendar'; +import {IslamicCivilCalendar, IslamicTabularCalendar, IslamicUmalquraCalendar} from './calendars/IslamicCalendar'; +import {JapaneseCalendar} from './calendars/JapaneseCalendar'; +import {PersianCalendar} from './calendars/PersianCalendar'; +import {TaiwanCalendar} from './calendars/TaiwanCalendar'; + +export function createCalendar(name: string): Calendar { + switch (name) { + case 'buddhist': + return new BuddhistCalendar(); + case 'ethiopic': + return new EthiopicCalendar(); + case 'ethioaa': + return new EthiopicAmeteAlemCalendar(); + case 'coptic': + return new CopticCalendar(); + case 'hebrew': + return new HebrewCalendar(); + case 'indian': + return new IndianCalendar(); + case 'islamic-civil': + return new IslamicCivilCalendar(); + case 'islamic-tbla': + return new IslamicTabularCalendar(); + case 'islamic-umalqura': + return new IslamicUmalquraCalendar(); + case 'japanese': + return new JapaneseCalendar(); + case 'persian': + return new PersianCalendar(); + case 'roc': + return new TaiwanCalendar(); + case 'gregory': + default: + return new GregorianCalendar(); + } +} diff --git a/packages/@internationalized/date/src/index.ts b/packages/@internationalized/date/src/index.ts new file mode 100644 index 00000000000..621cb9a9fde --- /dev/null +++ b/packages/@internationalized/date/src/index.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +export * from './CalendarDate'; +export {GregorianCalendar} from './calendars/GregorianCalendar'; +export {JapaneseCalendar} from './calendars/JapaneseCalendar'; +export {BuddhistCalendar} from './calendars/BuddhistCalendar'; +export {TaiwanCalendar} from './calendars/TaiwanCalendar'; +export {PersianCalendar} from './calendars/PersianCalendar'; +export {IndianCalendar} from './calendars/IndianCalendar'; +export {IslamicCivilCalendar, IslamicTabularCalendar, IslamicUmalquraCalendar} from './calendars/IslamicCalendar'; +export {HebrewCalendar} from './calendars/HebrewCalendar'; +export {EthiopicCalendar, EthiopicAmeteAlemCalendar, CopticCalendar} from './calendars/EthiopicCalendar'; +export {createCalendar} from './createCalendar'; +export * from './conversion'; +export * from './queries'; +export * from './types'; +export * from './string'; +export * from './DateFormatter'; diff --git a/packages/@internationalized/date/src/manipulation.ts b/packages/@internationalized/date/src/manipulation.ts new file mode 100644 index 00000000000..c3148f2ecfd --- /dev/null +++ b/packages/@internationalized/date/src/manipulation.ts @@ -0,0 +1,429 @@ +/* + * Copyright 2020 Adobe. All rights reserved. + * This file is licensed to you under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS + * OF ANY KIND, either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import {AnyCalendarDate, AnyTime, CycleOptions, CycleTimeOptions, DateField, DateFields, Disambiguation, Duration, TimeField, TimeFields} from './types'; +import {CalendarDate, CalendarDateTime, Time, ZonedDateTime} from './CalendarDate'; +import {epochFromDate, fromAbsolute, toAbsolute, toCalendar, toCalendarDateTime} from './conversion'; +import {getMinimumDayInMonth, getMinimumMonthInYear} from './queries'; +import {GregorianCalendar} from './calendars/GregorianCalendar'; +import {Mutable} from './utils'; + +const ONE_HOUR = 3600000; + +export function add(date: CalendarDateTime, duration: Duration): CalendarDateTime; +export function add(date: CalendarDate, duration: Duration): CalendarDate; +export function add(date: CalendarDate | CalendarDateTime, duration: Duration): CalendarDate | CalendarDateTime; +export function add(date: CalendarDate | CalendarDateTime, duration: Duration) { + let mutableDate: Mutable = date.copy(); + let days = 'hour' in date ? addTimeFields(date, duration) : 0; + + if (date.calendar.add) { + let res = date.calendar.add(date, duration); + mutableDate.era = res.era; + mutableDate.year = res.year; + mutableDate.month = res.month; + mutableDate.day = res.day; + } else { + addYears(mutableDate, duration.years || 0); + mutableDate.month += duration.months || 0; + + balanceYearMonth(mutableDate); + constrainMonthDay(mutableDate); + + mutableDate.day += (duration.weeks || 0) * 7; + mutableDate.day += duration.days || 0; + mutableDate.day += days; + + balanceDay(mutableDate); + + if (mutableDate.calendar.balanceDate) { + mutableDate.calendar.balanceDate(mutableDate); + } + } + + return mutableDate; +} + +function addYears(date: Mutable, years: number) { + if (date.calendar.addYears) { + date.calendar.addYears(date, years); + } else { + date.year += years; + } +} + +function balanceYearMonth(date: Mutable) { + while (date.month < 1) { + date.month += date.calendar.getMonthsInYear(date); + addYears(date, -1); + } + + let monthsInYear = 0; + while (date.month > (monthsInYear = date.calendar.getMonthsInYear(date))) { + date.month -= monthsInYear; + addYears(date, 1); + } +} + +function balanceDay(date: Mutable) { + while (date.day < 1) { + date.month--; + balanceYearMonth(date); + date.day += date.calendar.getDaysInMonth(date); + } + + while (date.day > date.calendar.getDaysInMonth(date)) { + date.day -= date.calendar.getDaysInMonth(date); + date.month++; + balanceYearMonth(date); + } +} + +function constrainMonthDay(date: Mutable) { + date.month = Math.max(getMinimumMonthInYear(date), Math.min(date.calendar.getMonthsInYear(date), date.month)); + date.day = Math.max(getMinimumDayInMonth(date), Math.min(date.calendar.getDaysInMonth(date), date.day)); +} + +function constrain(date: Mutable) { + if (date.calendar.constrainDate) { + date.calendar.constrainDate(date); + } + + date.year = Math.max(1, Math.min(date.calendar.getYearsInEra(date), date.year)); + constrainMonthDay(date); +} + +export function invertDuration(duration: Duration): Duration { + let inverseDuration = {}; + for (let key in duration) { + if (typeof duration[key] === 'number') { + inverseDuration[key] = -duration[key]; + } + } + + return inverseDuration; +} + +export function subtract(date: CalendarDateTime, duration: Duration): CalendarDateTime; +export function subtract(date: CalendarDate, duration: Duration): CalendarDate; +export function subtract(date: CalendarDate | CalendarDateTime, duration: Duration): CalendarDate | CalendarDateTime { + return add(date, invertDuration(duration)); +} + +export function set(date: CalendarDateTime, fields: DateFields): CalendarDateTime; +export function set(date: CalendarDate, fields: DateFields): CalendarDate; +export function set(date: CalendarDate | CalendarDateTime, fields: DateFields) { + let mutableDate: Mutable = date.copy(); + + if (fields.era != null) { + mutableDate.era = fields.era; + } + + if (fields.year != null) { + mutableDate.year = fields.year; + } + + if (fields.month != null) { + mutableDate.month = fields.month; + } + + if (fields.day != null) { + mutableDate.day = fields.day; + } + + constrain(mutableDate); + return mutableDate; +} + +export function setTime(value: CalendarDateTime, fields: TimeFields): CalendarDateTime; +export function setTime(value: Time, fields: TimeFields): Time; +export function setTime(value: Time | CalendarDateTime, fields: TimeFields) { + let mutableValue: Mutable