{"id":38698725,"url":"https://github.com/ddkasa/textual-timepiece","last_synced_at":"2026-01-17T10:44:16.374Z","repository":{"id":276611650,"uuid":"916558412","full_name":"ddkasa/textual-timepiece","owner":"ddkasa","description":"Various time related widgets \u0026 functionality for Textual.","archived":false,"fork":false,"pushed_at":"2025-11-24T15:08:42.000Z","size":1986,"stargazers_count":16,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-28T03:49:11.748Z","etag":null,"topics":["library","python","textual","time","whenever"],"latest_commit_sha":null,"homepage":"https://ddkasa.github.io/textual-timepiece/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ddkasa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-14T10:34:06.000Z","updated_at":"2025-11-24T15:00:36.000Z","dependencies_parsed_at":"2025-04-04T09:24:56.400Z","dependency_job_id":"25a50619-270a-4a39-9cf9-8d33edbe8849","html_url":"https://github.com/ddkasa/textual-timepiece","commit_stats":null,"previous_names":["ddkasa/textual-timepiece"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/ddkasa/textual-timepiece","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddkasa%2Ftextual-timepiece","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddkasa%2Ftextual-timepiece/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddkasa%2Ftextual-timepiece/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddkasa%2Ftextual-timepiece/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ddkasa","download_url":"https://codeload.github.com/ddkasa/textual-timepiece/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddkasa%2Ftextual-timepiece/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28506593,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T10:25:30.148Z","status":"ssl_error","status_checked_at":"2026-01-17T10:25:29.718Z","response_time":85,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["library","python","textual","time","whenever"],"created_at":"2026-01-17T10:44:15.747Z","updated_at":"2026-01-17T10:44:16.365Z","avatar_url":"https://github.com/ddkasa.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![PyPI - Version](https://img.shields.io/pypi/v/textual-timepiece)](https://pypi.org/project/textual-timepiece/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/textual-timepiece?link=https%3A%2F%2Fpypi.org%2Fproject%2Ftextual-timepiece%2F)](https://pypi.org/project/textual-timepiece/)\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/ddkasa/textual-timepiece/ci.yaml?link=https%3A%2F%2Fgithub.com%2Fddkasa%2Ftextual-timepiece%2Factions%2Fworkflows%2Fci.yaml)](https://github.com/ddkasa/textual-timepiece/actions/workflows/ci.yaml)\n[![codecov](https://codecov.io/github/ddkasa/textual-timepiece/graph/badge.svg?token=47OPXLN8J6)](https://codecov.io/github/ddkasa/textual-timepiece)\n[![Framework: Textual](https://img.shields.io/badge/framework-Textual-5967FF?logo=python)](https://textual.textualize.io/)\n\n# Textual Timepiece\n\n\u003e Various time management related widgets for the [Textual](https://github.com/Textualize/textual) framework.\n\n[Documentation](https://ddkasa.github.io/textual-timepiece/) | [Changelog](/docs/CHANGELOG.md) | [PyPi](https://pypi.org/project/textual-timepiece/)\n\n\u003cdetails\u003e\n\u003csummary\u003eIncluded Widgets\u003c/summary\u003e\n\n| Pickers                                                                                                                                  | Description                                                     |\n| :--------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------- |\n| [DatePicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DatePicker)                         | A visual date picker with an input and overlay.                 |\n| [DurationPicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DurationPicker)                 | Visual duration picker with duration up to 99 hours.            |\n| [TimePicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.TimePicker)                         | Visual time picker for setting a time in a 24 hour clock.       |\n| [DateTimePicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DateTimePicker)                 | Datetime picker that combines a date and time.                  |\n| [DateRangePicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DateRangePicker)               | Date range picker for picking an interval between two dates.    |\n| [DateTimeRangePicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DateTimeRangePicker)       | Range picker for picking an interval between two times.         |\n| [DateTimeDurationPicker](https://ddkasa.github.io/textual-timepiece/reference/pickers/#textual_timepiece.pickers.DateTimeDurationPicker) | Pick an interval between two times, including a duration input. |\n\n| Activity Heatmap                                                                                                                             | Description                                                                           |\n| :------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------ |\n| [ActivityHeatmap](https://ddkasa.github.io/textual-timepiece/reference/activity_heatmap/#textual_timepiece.activity_heatmap.ActivityHeatmap) | Activity Heatmap for displaying yearly data similar to the GitHub contribution graph. |\n| [HeatmapManager](https://ddkasa.github.io/textual-timepiece/reference/activity_heatmap/#textual_timepiece.activity_heatmap.HeatmapManager)   | Widget for browsing the Activity Heatmap with yearly navigation builtin.              |\n\n| Timeline                                                                                                                                               | Description                                                       |\n| :----------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------- |\n| [HorizontalEntry](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.HorizontalEntry)                           | Horizontal entry for a horizontal timeline layout.                |\n| [HorizontalRuler](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.HorizontalRuler)                           | Horizontal ruler for marking horizontal timelines.                |\n| [HorizontalTimeline](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.HorizontalTimeline)                     | Basic timeline widget that displays entries in a horizontal view. |\n| [HorizontalTimelineNavigation](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.HorizontalTimelineNavigation) | Horizontal widget containing a horizontal timeline and header.    |\n| [RuledHorizontalTimeline](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.RuledHorizontalTimeline)           | Ruled horizontal timeline with markers.                           |\n| [RuledVerticalTimeline](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.RuledVerticalTimeline)               | Ruled vertical timeline with markers.                             |\n| [VerticalEntry](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.VerticalEntry)                               | Vertical entry for a vertical timeline layout.                    |\n| [VerticalRuler](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.VerticalRuler)                               | Vertical ruler for marking vertical timelines.                    |\n| [VerticalTimeline](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.VerticalTimeline)                         | Basic timeline widget that displays entries in a vertical view.   |\n| [VerticalTimelineNavigation](https://ddkasa.github.io/textual-timepiece/reference/timeline/#textual_timepiece.timeline.VerticalTimelineNavigation)     | Vertical widget containing a vertical timeline and header.        |\n\n| Selector                                                                                                                   | Description                                                           |\n| :------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------- |\n| [DateSelect](https://ddkasa.github.io/textual-timepiece/reference/selectors/#textual_timepiece.pickers.DateSelect)         | Date selection widget with calendar panes.                            |\n| [TimeSelect](https://ddkasa.github.io/textual-timepiece/reference/selectors/#textual_timepiece.pickers.TimeSelect)         | Time selection widget with various times in 30 minute intervals.      |\n| [DurationSelect](https://ddkasa.github.io/textual-timepiece/reference/selectors/#textual_timepiece.pickers.DurationSelect) | Duration selection widget with modifiers for adjust time or duration. |\n\n| Input                                                                                                                | Description                                                    |\n| :------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------- |\n| [DateInput](https://ddkasa.github.io/textual-timepiece/reference/input/#textual_timepiece.pickers.DateInput)         | Date input which takes in a iso-format date.                   |\n| [TimeInput](https://ddkasa.github.io/textual-timepiece/reference/input/#textual_timepiece.pickers.TimeInput)         | Time input that takes in 24 hour clocked in a HH:MM:SS format. |\n| [DurationInput](https://ddkasa.github.io/textual-timepiece/reference/input/#textual_timepiece.pickers.DurationInput) | Duration input with a duration up to 99 hours.                 |\n| [DateTimeInput](https://ddkasa.github.io/textual-timepiece/reference/input/#textual_timepiece.pickers.DateTimeInput) | An input with a combination of a date and time in iso-format.  |\n\n\u003c/details\u003e\n\n## Demo\n\n### [UVX](https://docs.astral.sh/uv/)\n\n```sh\nuvx textual-timepiece\n```\n\n### [PIPX](https://github.com/pypa/pipx)\n\n```sh\npipx run textual-timepiece\n```\n\n## Install\n\n### Pip\n\n```sh\npip install textual-timepiece\n```\n\n### [UV](https://docs.astral.sh/uv/)\n\n```sh\nuv add textual-timepiece\n```\n\n### [Poetry](https://python-poetry.org)\n\n```sh\npoetry add textual-timepiece\n```\n\n\u003e [!NOTE]\n\u003e Requires [whenever](https://github.com/ariebovenberg/whenever) as an additional dependency.\n\n## Quick Start\n\n#### DatePicker\n\n##### Code\n\n```py\nfrom textual.app import App, ComposeResult\nfrom textual_timepiece.pickers import DatePicker\nfrom whenever import Date\n\nclass DatePickerApp(App[None]):\n    def compose(self) -\u003e ComposeResult:\n        yield DatePicker(Date(2025, 3, 4))\n\nif __name__ == \"__main__\":\n    DatePickerApp().run()\n```\n\n##### Result\n\n![DateTimePicker Example](https://github.com/ddkasa/textual-timepiece/blob/main/docs/media/images/date-picker-example.png)\n\n#### DateTimePicker\n\n##### Code\n\n```py\nfrom textual.app import App, ComposeResult\nfrom textual_timepiece.pickers import DateTimePicker\nfrom whenever import SystemDateTime\n\nclass DateTimePickerApp(App[None]):\n    def compose(self) -\u003e ComposeResult:\n        yield DateTimePicker(SystemDateTime(2025, 3, 4, 9, 42, 47)))\n\nif __name__ == \"__main__\":\n    DateTimePickerApp().run()\n```\n\n##### Result\n\n![DatePicker Example](https://github.com/ddkasa/textual-timepiece/blob/main/docs/media/images/datetime-picker-example.png)\n\n#### ActivityHeatmap\n\n##### Code\n\n```py\nimport random\nfrom collections import defaultdict\n\nfrom textual.app import App, ComposeResult\nfrom textual_timepiece.activity_heatmap import ActivityHeatmap, HeatmapManager\n\n\nclass ActivityApp(App[None]):\n    def _on_heatmap_manager_year_changed(\n        self,\n        message: HeatmapManager.YearChanged,\n    ) -\u003e None:\n        message.stop()\n        self.set_heatmap_data(message.year)\n\n    def retrieve_data(self, year: int) -\u003e ActivityHeatmap.ActivityData:\n        \"\"\"Placeholder example on how the data could be generated.\"\"\"\n        random.seed(year)\n        template = ActivityHeatmap.generate_empty_activity(year)\n        return defaultdict(\n            lambda: 0,\n            {\n                day: random.randint(6000, 20000)\n                for week in template\n                for day in week\n                if day\n            },\n        )\n\n    def set_heatmap_data(self, year: int) -\u003e None:\n        \"\"\"Sets the data based on the current data.\"\"\"\n        self.query_one(ActivityHeatmap).values = self.retrieve_data(year)\n\n    def _on_mount(self) -\u003e None:\n        self.set_heatmap_data(2025)\n\n    def compose(self) -\u003e ComposeResult:\n        yield HeatmapManager(2025)\n\n\nif __name__ == \"__main__\":\n    ActivityApp().run()\n```\n\n##### Result\n\n![ActivityHeatmap Example](https://github.com/ddkasa/textual-timepiece/blob/4a5d9439b2ee436e1b89a1e3189c0d6d5bc6f704/docs/media/images/activity-heatmap-example.png)\n\n- More examples can be found [here](https://ddkasa.github.io/textual-timepiece/examples)\n\n## License\n\nMIT. Check [LICENSE](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddkasa%2Ftextual-timepiece","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fddkasa%2Ftextual-timepiece","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddkasa%2Ftextual-timepiece/lists"}